2011-11-08 49 views
0

我有一個DLL(Database.dll)內的一類具有靜態屬性:需要訪問類的靜態屬性不添加DLL依賴

public class Database 
{ 
    public static int[] ReleasedDatabaseVersions 
    { 
     get { return new int[] { 5, 6, 7, 8 }; } 
    } 
} 

我創建了一個獨立的可執行文件(ValidateInstall.exe),這需要在Database類中訪問ReleasedDatabaseVersions

但是,我想ValidateInstall.exe完全獨立於Database.dll(即我希望能夠在未安裝此DLL的情況下在PC上運行它)。

在C++內聯會使這非常容易。這在C#中可能嗎?

我不想在我的可執行文件中重複這些數據,因爲這將是一個維護頭痛。

回答

1

你可以使用ILMerge生成後嵌入彙編抱着Database類到你的EXE:

ILMerge是可以用來 組件合併多個.NET成一個單一的組件的工具。

的ILMerge頁面還鏈接到article by Jeffrey Richter,詳細介紹瞭如何使用ILMerge實現類似沒有東西。

+0

謝謝 - 這對我有用。建立@Corey建議的共享DLL然後使用'ILMerge'將這個共享DLL與可執行文件結合起來。這刪除了任何運行時的依賴關係。 – LeopardSkinPillBoxHat

-1

在使用DllImport屬性請看:

http://msdn.microsoft.com/en-us/library/aa984739(v=VS.71).aspx

修訂 如果你不想使用後期綁定的這種方法,總有Assembly類。

Assembly a = Assembly.LoadFrom("Database.dll"); // This will throw an error that you can catch if the file does not exist. 
Database d = a.CreateInstance("Database") as Database; 

現在,我不確定反射是否會帶來所有的功能。我之前沒有使用過這種方法,所以我無法給你一個正確的解決方案。

+0

這與這個問題有關嗎? – LukeH

+0

那麼,這是實現後期綁定到一個dll文件的方式。 – Wizetux

+0

是的,OP明確表示他們不想這樣做:*「我想'ValidateInstall.exe'完全獨立於'Database.dll'(即我想能夠在PC上運行它沒有安裝這個DLL「*。 – LukeH

0

您可以將Database類的源代碼作爲鏈接添加到獨立項目中,以便兩個項目共享一個源代碼文件。

使用「添加現有項目...」時,請選擇「添加爲鏈接」而不是標準添加。

0

添加引用幷包含對構建的可執行文件的引用可以確保程序在沒有安裝DLL的系統上運行,方法是將其包含在構建中。

我真的不能想什麼辦法,而無需實際複製DLL或靜態內容分發該應用

1

我知道從哪裏一些B工程項目聯到其他一些項目中是唯一的情況下,常量和枚舉。在我看來,解決你的問題的.NET解決方法是將ReleasedDatabaseVersions分解到第三個項目中。然後這個第三個項目將被ValidateInstall.exe和Database.dll引用。