2012-04-10 56 views
3

我正在使用第三方dll開發我的應用程序,它是一個COM對象。我試圖使我的應用程序隔離,使用COM免註冊。但我無法找到很好的示例/步驟/教程來了解如何做到這一點。請告訴我我所做的是正確還是錯誤。COM例外:80040154,已經提供了清單

我爲原始dll創建了清單,使用tlbimp.exe生成了一個tyle庫,添加了作爲項目引用的類型庫,並正常地實例化了這個對象。儘管我已經提供的清單文件,我還收到此錯誤:

System.Runtime.InteropServices.COMException was unhandled
Message=Retrieving the COM class factory for component with CLSID {7B3A2D19-1D82-4DF6-8939-B730058A5535} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Google搜索這一點,這似乎是一個很多人指着構建配置,但我已經把我的構建中使用的x86。我很確定這個DLL也是在x86環境下開發的。 (我不知道這是否是相關或不..)

我所做的:

  • 不刪除DLL內的內部RT_MANIFEST提供外部清單。
  • 使用mt.exe更新RT_MANIFEST。
  • 使用由上述兩者生成的類型庫。

順便說一句,我也很好奇哪些FILEVERSION或PRODUCTVERSION號碼,我應該用於清單內的版本元素? (我都嘗試,既不工作)

Properties showing FileVersion and ProductVersion http://i40.tinypic.com/qpjymf.png

請告訴我在哪裏我做錯了什麼?我是否爲清單提供了錯誤信息?我怎麼知道我需要更多的清單信息?

如果您需要更多信息,請讓我知道。謝謝大家。

回答

1

這可能是由於此步驟:

Provide external manifest without removing the internal RT_MANIFEST inside the dll.

與Windows Server 2003 SP1的Windows啓動會忽略內部清單,如果一個文件有一個內部清單。您可以嘗試在blogKB article中提及的註冊表設置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide\PreferExternalManifest (DWORD) to 1。這將使Windows查看外部清單而不是內部清單。

但是,如果你要在多個系統上安裝它,你必須在你安裝的每個系統上設置這個標誌。這個設置是一個全局設置 - 影響所有應用程序,所以這可能不是一個好主意。

+0

據我所知,Windows將優先考慮內部而不是外部(對於Windows Server 2003和更高版本的Windows,爲true)。所以我嘗試使用mt.exe在DLL和exe文件中嵌入清單。仍然不起作用。 不,更改註冊表設置不是一個好主意。 :( – 2012-04-12 07:32:59