C# 如何在没有注册的情况下使用Win32中的.Net程序集?

C# 如何在没有注册的情况下使用Win32中的.Net程序集?,c#,delphi,interop,C#,Delphi,Interop,我想从Delphi Win32应用程序中动态加载并使用用C#创建的.Net程序集。我的类和接口标记为ComVisible,但我希望避免注册程序集。 这可能吗 另外,我在这里发现了关于这个话题的另一个很好的讨论,但更多的是围绕着主持CLR。这就引出了一个问题——为什么要托管CLR而不是使用ClrCreateManagedInstance?不幸的是,在不公开COM对象的情况下(据我所知),这是不可能做到的,因为.NET dll并没有真正编译到Delphi(或其他任何东西)可以加载的库中,因为这一切都

我想从Delphi Win32应用程序中动态加载并使用用C#创建的.Net程序集。我的类和接口标记为ComVisible,但我希望避免注册程序集。 这可能吗


另外,我在这里发现了关于这个话题的另一个很好的讨论,但更多的是围绕着主持CLR。这就引出了一个问题——为什么要托管CLR而不是使用ClrCreateManagedInstance?

不幸的是,在不公开COM对象的情况下(据我所知),这是不可能做到的,因为.NET dll并没有真正编译到Delphi(或其他任何东西)可以加载的库中,因为这一切都是由JIT编译器在运行时完成的。

奇怪的是,我找不到关于StackOverflow的答案,网上也没有太多,尤其是Delphi。我从发布的示例中找到了解决方案。 下面是我最后得到的:

function ClrCreateManagedInstance(pTypeName: PWideChar; const riid: TIID;
out ppObject): HRESULT; stdcall; external 'mscoree.dll';

procedure TMyDotNetInterop.InitDotNetAssemblyLibrary;
var
  MyIntf: IMyIntf;
hr: HRESULT;
NetClassName: WideString;
begin
//Partial assembly name works but full assembly name is preffered.
    NetClassName := 'MyCompany.MyDLLName.MyClassThatImplementsIMyIntf,
          MyCompany.MyDLLName';
    hr := ClrCreateManagedInstance(PWideChar(NetClassName), IMyIntf, MyIntf);
    //Check for error. Possible exception is EOleException with ErrorCode
    //FUSION_E_INVALID_NAME = $80131047 2148732999 : The given assembly name 
    //or codebase was invalid.
    //COR_E_TYPELOAD = $80131522 - "Could not find or load a specific type 
    //(class, enum, etc)"
    //E_NOINTERFACE = $80004002 - "Interface not supported".
    OleCheck(hr);
end;
顺便说一句,根据情况,您可能希望动态加载mscoree.dll,因为它可能不在系统上(XP没有.Net Framework)


编辑:不幸的是,正如我刚刚发现的那样,它被弃用并停止使用.Net4。这只剩下两个选项-。另外,.

可能使用RegFreeCOM和COm可调用包装器


但您不一定需要注册COM类。请注意,除非您已经将CLR加载到进程中,否则ClrCreateManagedInstance将在尝试加载最新版本之前尝试加载运行时v1.0.3705。。。这可能会引起一些有趣的行为。据我所知,RegFreeCOM用于从.NET访问COM。我的问题是关于从本机代码访问启用COM的.Net。通过托管CLR,您可以控制内存管理和异常处理挂钩。这些挂钩是为了让IIS和SQL Server等工具控制CLR运行的许多方面而创建的。@dthorpe另外,如果您想使用.Net4,CLR托管似乎是唯一的选项。您知道与ClrCreateManagedInstance或注册的COM实例化相比,它的开销是否更大?我认为开销是相同的。在这三种情况下,CLR都必须加载到进程中。唯一的区别是谁/如何启动加载。