2010-01-19 86 views
5

我一直在試圖讓免註冊的基於.NET的COM DLL工作,但沒有成功。配置基於.NET的組件免註冊激活

  • 在Visual Studio 2008中,我添加了一個新的C#類庫。
  • 我啓用了'make assembly COM-visible'和'register for COM interop'選項。
  • 我添加了一些公共接口和類的一些功能。
  • 我增加了一個明顯的相關性,以我的C++客戶端應用程序:的#pragma評論(連接「/ manifestdependency ...

但是,當我開始我的應用程序獲得「應用程序未能啓動,因爲應用程序配置不正確「

我已經使用微軟的mt工具來提取C++客戶端應用程序和C#COM DLL的清單文件,並且兩者中的信息都是相同的(C++清單文件中的dependentAssembly包含與COM清單文件中的assemblyIdentity相同的名稱和版本)

我也嘗試過在http://msdn.microsoft.com/en-us/library/eew13bza.aspx上描述的方法,但結果相似。

同樣,我試圖在我的C++客戶端應用程序的「框架和參考」中添加對我的COM項目的引用。該屬性頁面上的信息看起來很有前途(它顯示了'copy local','copy dependencies'等選項以及'assemblyIdentity'等屬性),但Visual Studio既不會複製DLL也不會自動向清單文件添加依賴項。

請注意,'註冊的變體'工作正常。

任何人有任何想法我做錯了什麼?

更新:

  • 當我創建一個簡單的C++ DLL和嵌入清單具有相同的名字和我的.NET COM DLL(相同assemblyIdentity)的版本,我的應用程序啓動時的罰款。所以問題在於我的.NET COM DLL的清單文件。
  • 我可以用mt -managedassemblyname:...成功從DLL中提取清單,然後嵌入與mt -outputresource:...相同的清單,但這也不會導致Windows成功解析依賴關係。

回答

4

我發現獲得註冊,免費的.NET COM互操作工作自己:-)

  • 運行所需要的步驟:mt -managedassemblyname:"myDll.dll" -out:"myDll.manifest"
  • 清潔清單(見格式的http://msdn.microsoft.com/en-us/library/eew13bza.aspx)。主要是我需要刪除除了assemblyIdentity,clrClass和文件(特別是刪除運行時,mvid和依賴標籤)之外的所有標籤。
  • 運行mt -outputresource:"myDll.dll" -manifest "myDll.manifest"。基本上,這會將修改後的清單作爲資源添加到DLL中。請注意,這顯然不是相同的清單(位置)!如果我使用managedassemblyname選項重新提取清單,我仍然會得到'舊'清單。如果我用inputresource選項提取它,我會得到新的。

我非常感謝Windows Vista發現這一切。與我的Windows XP不同,它包含一個名爲sxstrace的工具,它提供了有關並行執行問題的詳細信息。

+0

偉大的解決方案!這大大簡化了安裝過程。非常感謝! – 2010-01-20 10:54:34

+0

嗨,我有一個C++程序集,它執行一個Managed COM Assembly的共同創建,我需要類似的機制。我想繞過現有的.Net實現,並希望它調用到我的新實現中。 C++程序集依次通過.Net exe加載。那麼,應該如何爲C++端設計清單? – 2013-03-04 16:21:37

-2

當我這樣做時,我開始使用一個非常簡單的基本組件來獲取COM東西的排序。我還在最初的開發中使用了一個腳本客戶端。

我沒有使用Visual Studio,而是使用.NET代碼的文本編輯器。我爲程序集和接口插入了GUID,並標記了AutoDispatch的接口。

using System; 
using Interop=System.Runtime.InteropServices; 

namespace Whatever 
{ 
    [Interop.Guid("xxxxxxxx-9120-4283-b972-changethis05")] 
    [Interop.ComVisible(true)] 
    [Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)] 
    public partial class MyClass : 
    ... 
} 

我確信我的類有一個默認的(無參數)構造函數。

我手動運行regasm /codebase,從命令行指定.NET程序集。

我手動編碼的JavaScript來實例化對象。

當事情混亂時,我用OleView.exe檢查了ProgId。

一旦你有了基本的工作,逐漸增加複雜性,直到你得到工作解決方案。


您也可以使用從另一個方向;來自客戶端。 .NET組件如System.Random在安裝.NET時標記爲COM interop,因此您可以使用它們來驗證您在C++中的方法是否正確。實例化一個System.Random ProgId就像C++中的「hello,World」一樣。如果成功,那麼你知道C++的基本方法是合理的。

+0

我的COM互操作正常。問題在於免註冊部分。我無法成功嵌入我的清單文件,因此我的應用程序可以解析依賴關係。 Thx雖然答案。 – 2010-01-20 08:12:24