2011-07-04 48 views
0

我的第一個項目,類型類庫:如何從兩個C#項目生成單個DLL? C#DLL COM + C#DLL

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace Project2 
{ 
    public class Class1 
    { 
     public int num = 33; 
    } 
} 

使用命令行sn -k keyPair.snk我生成一個密鑰對,我加keypair.snk簽字。

第二個項目類型的類庫:

using System; 
using System.Runtime.InteropServices; 

using Project2; 

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() 
     { 
     Class1 obj = new Class1(); // Using first project 
     return obj.num; // return public int num = 33; 
     } 
    } 
} 

我加keypair.snk簽字。

使用「使用Project2;」在項目CSharpServer我點擊「添加/現有項目..」Project2.csproj後,我點擊「添加引用../項目」。

當我編譯時,生成兩個dll,如何用這兩個項目生成單個dll?

我讀過ILMerge。它似乎它結合了兩個DLL。但是我有源代碼,沒有辦法在Visual Studio中執行此連接?

我讀this CodeProject article說「你可以顯然只是將所有源文件添加到單個項目」,但如果我的第一個項目有1000個類?

我試圖ilmerge: 「C:\ Program Files文件\微軟\ ILMerge \ ilmerge」/目標:庫/out:project.dll CSharpServer.dll Project2.dll

生成一個文件project.dll

問題: 如果我這樣做:regasm project.dll/TLB /代碼庫

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

如何簽署此合併的DLL? CSharpServer.dll是帶接口的Component COM,需要註冊regasm。 Project2.dll不需要。 詳細信息, 我只想註冊CSharpServer.dll,但project.dll包含(CSharpServer.dll + Project2.dll)。現在?

我試着簽字:sn -R project.dll keyPair.snk。輸出:

Microsoft(R).NET Framework強名稱實用程序版本2.0.50727.42 版權所有(c)Microsoft Corporation。版權所有。

項目。DLL並不代表強命名程序集與

符號的作品: 要註冊,要提取公鑰: sn -p keyPair.snk publickey.snk

我讀了Giving a .NET SN

指定和匹配的公鑰: 「C:\ Program Files \ Microsoft \ ILMerge \ ilmerge」/keyfile:publickey.snk/target:library/out:project.dll CSharpServer.dll Project2.dll

After s用命令點亮: sn -R project.dll keyPair.snk

現在問題是: 註冊這個dll結合regasm。這就像regasm唯一的界面?它有什麼影響?

謝謝先進。

+3

你爲什麼不做一個單一的項目? – SLaks

+0

我模擬使用C#COM組件的庫。所以我不能放入同一個項目。 – Cobaia

+0

您從regasm.exe獲得的消息只是一個警告。這意味着:「你即將調用DLL地獄,你確定?」。你在你的開發機器上。運行ilmerge後,您必須手動簽署合併的程序集。使用sn.exe。合併的程序集包含來自project2.dll的類,並且現在在程序集中有1001個類而不是1000個,這不相關。請務必在每個要顯示的界面上明確使用[ComVisible]。 –

回答

0

您必須通過在visual studio外部使用csc.exe編譯代碼並自己傳遞命令行參數(所有.cs文件)來完成此操作。

這將是有點乏味,但可以完成。看看here

+0

我會盡力做到這一點,但「所有.Cs文件」。看起來很奇怪 – Cobaia

+0

如果我的一個項目有超過1000個課程?有沒有更簡單的方法來做到這一點? – Cobaia

+1

我不知道更好的方法。 – Aliostad