2011-06-30 52 views
2

你好我想用C#和Visual Studio 2005如何讓C#COM DLL相當於ATL COM C++

首先,我做了接口 「CSharpServer.cs」

<code> 
    using System; 
    using System.Runtime.InteropServices; 
    namespace CSharpServer 
    { 
     [ComVisible(true)] 
     [Guid("DBE0E8C4-1C61-41f3-B6A4-4E2F353D3D05")] 
     public interface IManagedInterface 
     { 
      int PrintHi(); 
     } 

     [ComVisible(true)] 
     [Guid("C6659361-1625-4746-931C-36014B146679")] 
     public class InterfaceImplementation : IManagedInterface 
     { 
      public int PrintHi() 
      { 
      Console.WriteLine("Hello!"); 
      return 33; 
      } 
     } 
    } 
</code> 

我開發一個COM編譯。輸出是:csharp_server.dll。之後,我做了:regasm csharp_server.dll/TLB /代碼庫
輸出是:

... RegAsm:警告RA0000:註冊一個無符號的組合與 /代碼庫可以CA 使用裝配干涉與其他應用程序可能 安裝在 同一臺計算機上。/codebase開關僅用於 ,帶有簽名 程序集。請給你的大會一個強有力的名字,並重新註冊 它。 類型註冊成功...

1ª問題:我必須簽署?怎麼樣?

2ª問題:由作者刪除。

3ª問:我可以只運行由Visual Studio 「regasm」 命令提示符。很快,如果我使用C#開發COM組件並分發給客戶端,那麼它還必須安裝Visual Studio?如果客戶剛剛安裝了Delphi,並且想要使用組件,它將不得不安裝Visual Studio?

4ªVisual Studio內部的C#,我嘗試添加COM引用,但說:

可以 不能添加到 'csharp_server' 的引用。該ActiveX類型庫 「XXX \ csharp_server.tlb」是從.NET組件出口 ,不能 加入作爲參考。相反,向.NET程序集添加引用 。 但是在「.NET參考」中。我看不到組件「csharp_server」。

什麼我做錯了或者忘記?

在此先感謝。

回答

4

#1閱讀sn.exe。生成一個強大的名稱密鑰文件,然後在解決方案資源管理器中右鍵單擊您的項目並編輯其屬性。選擇「簽名」選項卡並添加密鑰文件。如果你的公司有一個密鑰文件,你可以延遲簽署程序集,然後將它傳遞給私鑰的守護者(你將無法訪問它,因爲它是非常鎖定的,因爲如果它是公開的,任何人都可以簽名應用程序模擬您的公司)。不要忘記在解決方案資源管理器中打開「屬性」文件夾並編輯名稱/版本/等。你的程序集。

#2你是說你可以使用DLL已經刪除了它?這很難相信。

#3安裝程序包如Installshield的具有用於根據需要註冊.NET組件規定。或者,您可以使用regasm/regfile生成可以合併到目標註冊表中的.reg。我真的建議:1)使用商業工具來建立你的安裝程序,或者2)成爲MSI技術的閃亮之神。使用SDK工具編寫正確的安裝程序非常困難,甚至使用Wix也是如此。

據我所知,#4沒有解決方法。我想微軟決定讓託管程序集通過第二個託管程序集實現的COM接口包裝程序上的託管包裝程序集來訪問另一個託管程序集是錯誤的。也許他們不希望它成爲解決私有/全局程序集綁定規則的常用方法。

無論如何,也許你可以編輯類型庫,以便它「欺騙」託管包裝生成器(TlbImp.exe),使其認爲它是一個本機COM類型庫,但它真的值得嗎?大多數帶有公共API的商業應用程序都有從COM和託管客戶端使用應用程序API的說明,根據應用程序的實現,其中一個或另一個是包裝程序。多年來,這種技術一直在爲許多供應商工作,沒有問題。

+0

謝謝。它解決了。 – Cobaia

+0

#1ª工程。我更改了「AssemblyInfo.cs」並使用命令「sn -k keyPair.snk」生成密鑰對#2ª對此問題抱歉,真的出來了。我將編輯帖子。 #3ª雖然我還沒有生成數據包。我認爲這會按照你說的方式工作。謝謝#4ª完美!我想我明白了。 – Cobaia