环境:Win7,Delphi 2010
我有需要的类和接口的.NET程序集 .
我看到程序集安装了gacutils.exe .
Interop.CNHVoyager2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5162c9617d11c099, processorArchitecture=x86
主要问题是程序集不提供COM接口 .
是否可以从Delphi访问程序集内的类和接口?
我试试这样:
procedure TCardReader.InitDotNetAssemblyLibrary;
var
card: ICNHV2Card;
hr: HRESULT;
NetClassName: WideString;
begin
NetClassName := 'CNHVoyager2.CNHV2Card, Interop.CNHVoyager2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5162c9617d11c099, processorArchitecture=x86';
hr := ClrCreateManagedInstance(PWideChar(NetClassName), StringToGUID('{155EF4F5-AA34- 4FF4-8EEA-DC4223DF139C}'), card);
OleCheck(hr);
end;
我收到一条消息:
Class is not registered.
.NET dll位于项目的文件夹中,并从该位置注册 .
有可能吗?
UPDATE: 正如大卫所说我已经检查了现有的包装器 . 我从中找到了Item导出的TLB文件,现在看到里面的内容:
_foDevice = interface(IDispatch)
['{E21BD447-D9D6-4E40-9A5E-244AEC7CE979}']
function ReadFileDirect(const oDriver: IfoFODD; const sFolder: WideString;
const sFilename: WideString): IfoSummary; safecall;
end;
所以我可以读取所需的数据文件 . 但我需要IfoFODD驱动程序接口来做到这一点 . 在TLB中,我看不到它 . 而且我认为它在.NET not-com-assembly中是本质上的驱动程序 . 我可以做一些类似反汇编的接口吗?或者它是另一种(正确的)使用方式吗?
1 回答
您可以通过编写适配器来解决此问题 . 创建一个C#程序集,该程序集使用您希望使用的程序集作为参考 . 汇总COM可见类中所需的类 . 然后,Delphi代码可以使用您的COM适配器 .
另一个选择是调整程序集并公开经典的本机DLL接口 . 您可以使用C / CLI混合模式执行此操作 . 或者使用Robert Gieseke的UnmanagedExports . COM包装器可能更清晰,更容易编码 .
你可以按照你的方式去做 . 虽然您使用的是不推荐使用的界面 . 托管是这些日子的目的 . 但是,要想做到这一点真的很棘手 . 它涉及大量锅炉板 . 你将不得不做大量的腿部工作,你可以通过COM免费获得 . 我真的不会推荐这条路线 . 用COM包裹它,让生活变得简单 .