2009-04-24 46 views
9

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

P.S.我在这里找到了link text关于这个话题的另一个很好的讨论,但它更多的是在主持CLR。这引出了一个问题 - 你为什么要主持CLR而不是使用ClrCreateManagedInstance?

+0

通过举办你获得的被创建允许的事情如IIS和SQL Server控制的CLR如何运作的诸多方面的内存管理和异常处理钩子控制的CLR。 – dthorpe 2011-05-20 01:39:34

+0

@dthorpe另外,如果您想使用.Net4,它看起来像CLR托管是唯一的选择。你知道它是否有更多的开销与ClrCreateManagedInstance或注册的COM实例吗? – 2011-05-21 04:40:44

+0

我会认为开销是相同的。在所有这三种情况下,都必须将CLR加载到流程中。唯一的区别是负载是由谁启动的。 – dthorpe 2011-05-23 16:53:49

回答

8

奇怪的是,我无法在StackOverflow上找到答案,并且网上没有太多东西,尤其是对于Delphi。我发现来自示例的解决方案发布了here。 这是我在结束了:

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; 

BTW,根据不同的情况,你可能想MSCOREE.DLL动态加载,因为它可能是不存在的系统(XP没有.Net框架)上

编辑:不幸的是,这已被弃用,并停止与.Net4一起工作,因为我刚刚发现。这只剩下两个选项 - CLR hosting and unmanaged export。另外,debugging of .Net4 COM code is broken

0

不幸的是,在不暴露COM对象的情况下无法完成(据我所知),因为.NET dll没有真正编译到Delphi(或任何其他)可以加载的库中,因为这完全是由JIT编译器在运行时。

+0

但是你不一定需要注册COM类。 – 2009-04-24 19:51:47

相关问题