Ack. I've worked around the problem by creating a custom version of ir.exe
which calls CoInitializeSecurity.
It would be great if there were a less hacky way of doing this (that I
wouldn't have to re-do when ironruby 1.0 comes out), but yeah :-(
Here's the code
namespace sec_ir
{
class CoInitializeRubyConsoleHost : ConsoleHost
{
[RubyStackTraceHidden, MTAThread]
static int Main( string[] args )
{
ComHelpers.CoInitializeSecurity();
SetHome();
return new CoInitializeRubyConsoleHost().Run(args);
}
//
--------------------------------------------------------------------
protected override CommandLine CreateCommandLine()
{
return new RubyCommandLine();
}
protected override Microsoft.Scripting.Hosting.LanguageSetup
CreateLanguageSetup()
{
return Ruby.CreateRubySetup();
}
protected override OptionsParser CreateOptionsParser()
{
return new RubyOptionsParser();
}
protected override Type Provider
{
get
{
return typeof(RubyContext);
}
}
//
--------------------------------------------------------------------
static void SetHome()
{
try
{
var platform = PlatformAdaptationLayer.Default;
var homeDirectory = RubyUtils.GetHomeDirectory(platform);
platform.SetEnvironmentVariable("HOME", homeDirectory);
}
catch( SecurityException exception )
{
if( exception.PermissionType !=
typeof(EnvironmentPermission) )
throw;
}
}
}
}
static class ComHelpers
{
/// <summary>
/// Call CoInitializeSecurity with dwImpLevel set to Impersonate.
/// </summary>
public static void CoInitializeSecurity()
{
CoInitializeSecurity(IntPtr.Zero,
-1,
IntPtr.Zero,
IntPtr.Zero,
(uint)RpcAuthnLevel.PktPrivacy,
(uint)RpcImpLevel.Impersonate,
IntPtr.Zero,
(uint)EoAuthnCap.DynamicCloaking,
IntPtr.Zero);
}
/// <summary>
/// Define RPC_C_AUTHN_LEVEL_ constants
/// </summary>
enum RpcAuthnLevel
{
Default = 0,
None,
Connect,
Call,
Pkt,
PktIntegrity,
PktPrivacy
}
/// <summary>
/// Define RPC_C_IMP_LEVEL_ constants
/// </summary>
enum RpcImpLevel
{
Default = 0,
Anonymous,
Identify,
Impersonate,
Delegate
}
/// <summary>
/// Define EOAC_ constants
/// </summary>
enum EoAuthnCap
{
None = 0x0000,
MutualAuth = 0x0001,
StaticCloaking = 0x0020,
DynamicCloaking = 0x0040,
AnyAuthority = 0x0080,
MakeFullSIC = 0x0100,
Default = 0x0800,
SecureRefs = 0x0002,
AccessControl = 0x0004,
AppID = 0x0008,
Dynamic = 0x0010,
RequireFullSIC = 0x0200,
AutoImpersonate = 0x0400,
NoCustomMarshal = 0x2000,
DisableAAA = 0x1000
}
// Create the call with PreserveSig:=FALSE so the COM InterOp
// layer will perform the error checking and throw an
// exception instead of returning an HRESULT.
//
[DllImport("Ole32.dll",
ExactSpelling = true,
EntryPoint = "CoInitializeSecurity",
CallingConvention = CallingConvention.StdCall,
SetLastError = false,
PreserveSig = false)]
static extern void CoInitializeSecurity(
IntPtr pVoid,
int cAuthSvc,
IntPtr asAuthSvc,
IntPtr pReserved1,
uint dwAuthnLevel,
uint dwImpLevel,
IntPtr pAuthList,
uint dwCapabilities,
IntPtr pReserved3 );
}
_______________________________________________
Ironruby-core mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/ironruby-core