簡體   English   中英

C#包裝器接口錯誤:E_NOINTERFACE

[英]C# wrapper interface error: E_NOINTERFACE

我正在嘗試為我擁有的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}" />

可以從Visual Studio生成的Native.Namespace.Assembly.Name.manifest中找到TLBID,如下所示:

<typelib tlbid="{A-GUID-IS-HERE--USE-IT}"
  version="1.0" helpdir="" resourceid="0" flags="HASDISKIMAGE" />

我花了相當長的時間對此進行思考,但是我發現了這些有用的參考資料並將其拼湊起來,對我來說很有效:

錯誤代碼表示Visual Studio 認為某個對象應該實現某個接口,但是當我嘗試“連接”到該接口時,該對象會做出響應,表示它不知道該對象。

我猜問題出在SC_COM.dll中。 TLBIMP.EXE從DLL中存儲的元數據中提取類和接口信息,並為該類構建包裝器。

例如,如果SC_COM是用C ++編寫的,那么如果IDL文件中指示的DLL的創建者某個類實現了該接口,但實際代碼不支持該接口,則可能發生這種情況。

這是該DLL可能存在的另一個常見問題源:有時,您有一個類實現了ISomething2接口,該接口派生自ISomething接口,但是該類實現僅識別ISomething2。 如果實現派生接口,則還必須識別其基本接口。 這是一個常見的錯誤。

您是否擁有(並控制)DLL的源代碼?

哪個版本的Windows? 從Windows Vista開始,內部清單會覆蓋外部清單。 默認情況下,C#可執行文件具有內部清單,這意味着您的whatever.exe.manifest文件將被忽略。

如果轉到C#EXE的屬性頁,則會在“應用程序”選項卡上看到“圖標和清單”部分。 將“清單”設置為清單文件的名稱,它將被嵌入而不是默認文件。

如果這不起作用,則可能必須對MT.EXE執行一些生成后步驟,以便將外部清單與默認的內部清單合並,並將合並的清單重新放回.EXE文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM