我想从 Delphi Win32 应用程序动态加载和使用用 C# 创建的 .Net 程序集。我的类和接口被标记为 ComVisible,但我想避免注册程序集。
这可能吗?
附:我在这里找到了链接文本关于该主题的另一个很好的讨论,但它更多地围绕托管 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;
顺便说一句,根据具体情况,您可能需要动态加载 mscoree.dll,因为系统上可能不存在它(没有 .Net Framework 的 XP)
编辑:不幸的是,正如我刚刚发现的那样,这已被弃用并停止与 .Net4 一起使用。这只剩下两个选择——CLR 托管和非托管导出. Also, .Net4 COM 代码的调试已损坏.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)