首页 文章

使用来自delphi的com-invisible .net程序集

提问于
浏览
0

环境: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 回答

  • 2

    您可以通过编写适配器来解决此问题 . 创建一个C#程序集,该程序集使用您希望使用的程序集作为参考 . 汇总COM可见类中所需的类 . 然后,Delphi代码可以使用您的COM适配器 .

    另一个选择是调整程序集并公开经典的本机DLL接口 . 您可以使用C / CLI混合模式执行此操作 . 或者使用Robert Gieseke的UnmanagedExports . COM包装器可能更清晰,更容易编码 .

    你可以按照你的方式去做 . 虽然您使用的是不推荐使用的界面 . 托管是这些日子的目的 . 但是,要想做到这一点真的很棘手 . 它涉及大量锅炉板 . 你将不得不做大量的腿部工作,你可以通过COM免费获得 . 我真的不会推荐这条路线 . 用COM包裹它,让生活变得简单 .

相关问题