2010-11-16 98 views
4

我不是一個.NET開發人員,所以可能有一些基本的東西,我不知道。強簽名的程序集

我在C#中的一些經驗的編碼,但現在我有一個問題。我的一個項目(A)引用了另一個ptoject(B),並設置了「本地副本」。當B.dll與A.exe位於同一位置時,一切正常。但是,當B.dll被放在PATH的公共目錄中時,它不起作用。

我的一個同事說他想法我應該讓B強烈簽名。他是對的嗎?這就是爲什麼一個人會強烈地簽署一個會議?

我在網上看了一些有關,但所有我看到的是有關安全的......如果是這樣,一個人如何簽訂組裝和它有什麼樣的後果?請注意,我正在使用VS2003 .Net 1.1。

編輯:謝謝大家對我付出的答案,但是你提供參考更高版本的VS和.NET具有某種在項目屬性簽署標籤的鏈接。有人知道(或給出鏈接)如何在VS2003 .Net1.1中強烈地命名該程序集?

回答

2

我認爲您的同事可能指的是「強命名」大會。 強名稱是您可以將程序集部署到GAC的原因。

一旦它是在GAC,然後使用該組件的任何應用程序總是可以找到它。路徑是不相關的,這是部署共享程序集的首選方式。

要強大地聲明程序集的名稱,可以使用Visual Studio附帶的sn.exe tool生成強名稱,然後使用通過sn.exe生成的密鑰文件對程序集簽名。

編輯:如何使用SN.EXE強名稱的組件實例是here

另外,我想你應該明白是怎麼運行的負載組件。從MSDN

運行時使用以下步驟來解決一個裝配參考:

通過檢查適用 配置文件,包括應用程序配置文件, 發行者策略文件確定正確的程序集版本,和機器配置文件。

如果配置文件位於遠程機器上,則運行時必須首先找到並下載應用程序配置文件 。

檢查程序集名稱是否已被綁定到之前,如果是,則 使用先前加載的程序集。

檢查全局程序集緩存。如果在那裏找到程序集,則 運行時使用此程序集。

探針爲通過以下步驟裝配:如果配置 和發行者策略不影響原始參考,並且如果 綁定請求使用Assembly.LoadFrom方法創建的,則 運行時檢查位置提示。

如果在配置文件中找到代碼庫,運行時只檢查 這個位置。如果此探測失敗,則運行時會確定綁定請求失敗並且不會發生其他探測。

使用探測 部分中描述的啓發式裝配的探測器部分。如果在探測之後沒有找到程序集,則運行時 將請求Windows安裝程序提供程序集。這起到 安裝點播功能的作用。

注:沒有版本檢測組件而不強 的名字,也沒有在全局程序集緩存 組件運行時檢查不強名稱。

+0

看我的編輯請 – 2010-11-16 11:00:03

+0

@阿門 - 兩個鏈接更新爲.NET 1.1。注意:這個用法的大部分與1.1不變,因此任何其他的鏈接在任何情況下都應該幾乎相同。 – InSane 2010-11-16 11:01:43

+0

@Armen - 還添加了一個MSDN鏈接,其中包含有關如何使用SN.exe的步驟 – InSane 2010-11-16 11:03:18

5

您的問題沒有在第一時間與程序集簽名。 .NET不使用PATH環境變量來加載程序集。該過程實際上是一個比較複雜的,你最好在MSDN閱讀所有細節(見步驟1至步驟4):

How the Runtime Locates Assemblies

在你的情況下,它可能是最好的安裝共享程序集到GAC。安裝到GAC要求你的程序集有一個強名,所以這可能是你的同事提到的。

更新:

正如你具體問到強命名.NET 1.1大會我建議檢查出以下問題:

How to give a .NET 1.1 dll a strong name in VS2003

+0

打我吧;) – Oded 2010-11-16 10:42:57

+0

看我的編輯請 – 2010-11-16 10:59:29

1

你想把B.dll放在一個公共目錄中的原因是什麼?是因爲它可以被另一個程序使用嗎?如果願意,將其添加到GAC是最佳選擇。請參閱this一個

1

由於0xA3已經提到你應該閱讀MSDN上的文章。但文中解釋不好的是使用AssemblyResolve事件。如果框架沒有在任何地方找到程序集,就會被拋出,讓你有機會開始搜索自己(也許在你的公共文件夾中)並返回所需的程序集。

有關如何使用此功能的示例,請參閱my question here

相關問題