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

时间:2009-04-24 19:47:52

标签: c# delphi interop

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

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

3 个答案:

答案 0 :(得分: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,因为它可能不存在于系统上(没有.Net Framework的XP)

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

答案 1 :(得分:1)

可能使用RegFreeCOM和COm-Callable Wrapper。

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

答案 2 :(得分:0)

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

相关问题