我在尝试使用第三方提供的旧版TLB中通过tlbimpb.exe生成的DLL时收到此错误:
System.InvalidCastException:无法转换类型的COM对象 'SOME.CLASS'接口类型'SOME.INTERFACE1'。这个操作 失败,因为QueryInterface调用了COM组件 与IID'{52525E8D-4359-4139-B454-F5157A3607D2}接口失败 出现以下错误:未支持此类接口(例外情况) HRESULT:0x80004002(E_NOINTERFACE))。
有没有人知道在C#.NET 4.5+中使用“遗留”TLB是否有正确的方法,而不仅仅是使用tlbimp.exe创建DLL?或者TLB的供应商是否有可能在他们的最后做某事?
进一步详情:
我有一个从供应商提供给我的tlb文件生成的DLL。我使用tlbimp.exe生成了DLL。供应商提供了一个DLL,但它们似乎不记得它是如何创建的。无论如何,当使用DotPeek / Reflector检查时,两个DLL看起来都是相同的。
DLL中有3个接口和一个类。为了使用DLL中的方法,我使用如下类:
VendorDLL.SomeClass vendorObject = new VendorDLL.SomeClass();
var string = vendorObject.Method1();
但是,除非我在计算机上安装供应商的SDK,否则当我尝试从类中实例化一个对象时,我会收到上面引用的COM错误。
如果我反汇编使用Reflector / DotPeek生成的DLL,我可以看到两个接口使用上面提到的错误提到的GUID。类和其他接口使用不同的GUID。如果我在以前从未使用过的计算机上安装供应商软件,则供应商的安装程序不会注册上述错误所抱怨的524 GUID。当然,如果我尝试使用任何引用DLL的软件,我会收到上述错误。唯一看似可以解决的问题是安装供应商的SDK,正如我上面提到的那样。
我向供应商提出了这个问题,他们感到困惑。他们已经指出,与他们的软件一起安装的测试程序使用与我尝试使用的COM对象相同的COM对象,并且它在没有我上面提到的GUID注册的情况下工作。这是真的。我可以使用他们的测试程序,没有任何COM错误。对于它的价值,他们的测试程序似乎是用VB6编写的,所以我猜他们正在使用.TLB。
结果,我开始怀疑自己是不是做错了什么。我查看了他们的代码示例,但遗憾的是他们的所有示例都是用VB编写的(不确定是哪个版本),Delphi和旧版本的Visual C ++。所有示例似乎都使用供应商提供的TLB文件而不是DLL。我试过搜索,所有地方似乎都建议使用TLB我必须生成一个DLL才能与C#一起使用。这是正确的还是我做错了什么?
如果我遗漏了一些东西,请告诉我。
编辑:对于那些好奇的人,我尝试在C#中使用以下项目类型:
他们所有人的主要方法都有[STAThread]。