tox*_*erd 11 c# delphi com interop
我需要使用很久以前在Delphi中开发的COM组件(dll).问题是:dll不包含类型库...并且.NET中的每个互操作功能(例如,TlbImp)似乎都依赖于TLB.这个组件已经在Delphi程序中使用了很多年没有问题,因为"使用Delphi的COM对象并不是什么问题,因为我们知道接口"(引用Delphi开发人员).
有没有办法在没有TLB的情况下从c#中使用这个DLL?我已经使用DLL作为未试过,但唯一的方法是出口DllUnregisterServer,DllRegisterServer,DllCanUnloadNow和DllGetClassObject.我知道我将要使用的类和函数的名称,如果这可以有任何帮助.
更新: 我已经尝试过实施Jeff的建议,但是我收到了这个错误:
"无法将'ComTest.ResSrvDll'类型的COM对象强制转换为接口类型'ComTest.IResSrvDll'.此操作失败,因为对于具有IID'{75400500-939F-11D4-9E44-0050040CE72C}的接口的COM组件上的QueryInterface调用'由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))."
这就是我所做的:
我从其中一个Delphi人那里得到了这个接口定义:
unit ResSrvDllIf;
interface
type
IResSrvDll = interface
['{75400500-939F-11D4-9E44-0050040CE72C}']
procedure clearAll;
function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString;
const aResFileName: WideString; aResShared: Integer): Integer; {safecall;}
...
end;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
从这个我做了这个界面
using System.Runtime.InteropServices;
namespace ComTest
{
[ComImport]
[Guid("75400500-939F-11D4-9E44-0050040CE72C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IResSrvDll
{
int ResObjOpen(string aClientID, string aClientSubID, string aResFileName, int aResShared);
}
}
Run Code Online (Sandbox Code Playgroud)
而这个coclass(得到了德尔福人的指导)
using System.Runtime.InteropServices;
namespace ComTest
{
[ComImport]
[Guid("75400503-939F-11D4-9E44-0050040CE72C")]
public class ResSrvDll
{
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
Jeff的解决方案是实现这一目标的方法.但值得注意的是,接口定义必须与COM组件完全匹配!即.相同的顺序,相同的名称等