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

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

PS我在这里找到链接文本关于该主题的另一个很好的讨论,但它更多地围绕托管CLR。 这引出了一个问题 – 为什么你要主持CLR而不是使用ClrCreateManagedInstance?

奇怪的是,我无法在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,因为它可能不存在于系统上(没有.Net Framework的XP)

编辑:不幸的是,我刚刚发现,这已被弃用并停止使用.Net4。 这只留下两个选项 – CLR托管和非托管导出 。 此外, .Net4 COM代码的调试被破坏 。

也许使用RegFreeCOM和COm-Callable Wrapper。

http://msdn.microsoft.com/en-us/magazine/cc188708.aspx

遗憾的是,在没有暴露COM对象的情况下,这是不可能完成的(因为我的知识),因为.NET dll不是TRULY编译到Delphi(或其他任何东西)可以加载的库,因为这一切都是由JIT编译器在运行时完成的。