我想动态加载并使用Delphi Win32应用程序中用C#创建的.Net程序集。我的类和接口被标记为ComVisible,但我想避免注册程序集。 这可能吗?如何从Win32使用.Net程序集而不注册?
P.S.我在这里找到了link text关于这个话题的另一个很好的讨论,但它更多的是在主持CLR。这引出了一个问题 - 你为什么要主持CLR而不是使用ClrCreateManagedInstance?
我想动态加载并使用Delphi Win32应用程序中用C#创建的.Net程序集。我的类和接口被标记为ComVisible,但我想避免注册程序集。 这可能吗?如何从Win32使用.Net程序集而不注册?
P.S.我在这里找到了link text关于这个话题的另一个很好的讨论,但它更多的是在主持CLR。这引出了一个问题 - 你为什么要主持CLR而不是使用ClrCreateManagedInstance?
奇怪的是,我无法在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。
不幸的是,在不暴露COM对象的情况下无法完成(据我所知),因为.NET dll没有真正编译到Delphi(或任何其他)可以加载的库中,因为这完全是由JIT编译器在运行时。
但是你不一定需要注册COM类。 – 2009-04-24 19:51:47
也许使用RegFreeCOM和COm-Callable Wrapper。
通过举办你获得的被创建允许的事情如IIS和SQL Server控制的CLR如何运作的诸多方面的内存管理和异常处理钩子控制的CLR。 – dthorpe 2011-05-20 01:39:34
@dthorpe另外,如果您想使用.Net4,它看起来像CLR托管是唯一的选择。你知道它是否有更多的开销与ClrCreateManagedInstance或注册的COM实例吗? – 2011-05-21 04:40:44
我会认为开销是相同的。在所有这三种情况下,都必须将CLR加载到流程中。唯一的区别是负载是由谁启动的。 – dthorpe 2011-05-23 16:53:49