我正在尝试为我拥有的COM对象(名为SC_COM.dll)生成一个C#包装器,但是在将它与Visual Studio 2008(运行Vista)链接时遇到了一些问题.我需要使用COM DLL免费注册 - 我使用清单文件让Visual Studio了解SC_COM.dll,这似乎正在运行.我使用TblImp.exe生成我在Visual Studio 2008中引用的类型库(SC_COMtlb.dll),因此我可以使用我需要的DLL进行早期绑定.DLL与清单和可执行文件位于同一目录中.
这是问题:当我实例化对象并尝试在C#中调用其中一个方法时,它会抛出以下错误:
检测到错误:无法将类型为"SC_COMtlb.SCAccessObjClass"的COM对象强制转换为接口类型"SC_COMtlb.ISCUploader".此操作失败,因为对于具有IID"{C677308A-AC0F-427D-889A-47E5DC990138}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .
我不完全确定这个错误意味着什么 - 我已经对错误代码进行了搜索,而且它似乎是一个相对普遍的C#错误.所以我要在这里以错误的方式链接COM对象,还是有一些其他重要的步骤我可能会丢失?
我应该注意到,我不完全确定我生成的类型库(S\C_COMtlb.dll)是如何知道实际COM DLL的位置,因为它没有在系统中注册 - 我认为它只是看起来相同目录.这可能是问题,如果是这样,我怎样才能更好地将这两者联系起来?
尝试将此添加到您的App.exe.manifest:
<comInterfaceExternalProxyStub
name="ISCUploader"
iid="{C677308A-AC0F-427D-889A-47E5DC990138}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{PUT-YOUR-TLB-GUID-HERE}" />
Run Code Online (Sandbox Code Playgroud)
可以从Visual Studio生成的Native.Namespace.Assembly.Name.manifest中找到TLBID,如下所示:
<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />
Run Code Online (Sandbox Code Playgroud)
很长一段时间以来,我一直在反对这个问题,但是我找到了这些有用的参考资料并将它拼凑在一起,它对我有用:
| 归档时间: |
|
| 查看次数: |
9442 次 |
| 最近记录: |