2009-08-17 28 views
2

我已經使用VSTO編寫了一些Excel 2003/2007加載項,並且通常最終會引用VSTO項目中的.NET DLL(通常是我在各個項目中重複使用的代碼)。
我遇到了以下問題。雖然調用DLL可以在調試模式下或在開發機器上完美工作,但當我通過msi安裝程序部署外接程序時,該DLL會添加到加載項的文件夾中,但加載項不會似乎能夠調用該DLL。
經過一番努力之後,我想出了一個解決方法:在安裝程序的自定義操作之上,爲加載項授予安全性,我添加另一個自定義操作,授予安全性給每個由加載項引用的單個dll,
http://msdn.microsoft.com/en-us/library/bb332052.aspx如何將引用程序集添加到VSTO項目的部署?

我的問題是,雖然它的工作,我不相信我做對了。這是非常乏味的,而且我在構建時也會收到警告,從我所能做的事實際上,它指出了在同一位置授予兩次安全性的事實。
這裏的任何人都可以告訴我,我是否正確地做對了,如果有的話更好的方法是什麼?

回答

1

就我而言,我在MyCompany.Office下有一套加載項。

我有一個稱爲MyCompany.Office.dll的共享庫,它由MyCompany.Office.Word.dll和MyCompany.Office.Excel.dll引用,它們都是加載項(您可以很容易地Excel的多個加載項,而不是一個Word和一個Excel,或任何你想要的)。

我所做的是爲解決方案創建一個強名稱密鑰文件,並將其鏈接到所有三個項目中。然後我使用相同的強名稱密鑰文件對所有三個庫進行了簽名。

然後,我創建了一個安裝程序操作,它使用公鑰作爲證據添加CAS條目,而不是文件位置。所以,我的自定義操作最終會調用caspol.exe -m -q -ag "My_Computer_Zone" -strong -hex <my public key> -noname -noversion FullTrust -n "MyCompany_Office" -d "Code group for MyCompany.Office add-ins."。這使FullTrust能夠使用該公鑰的所有圖書館。

您可以通過打開命令提示符,導航到密鑰文件位置並鍵入sn -Tp mykeyfile.snk來查看公鑰。如果你想獲得的公共密鑰親語法(如延長SetSecurity),你可以使用這樣的代碼:

private static String GetPublicKeyHexString(String assemblyPath) 
{ 
    AssemblyName assmName = Assembly.LoadFile(assemblyPath).GetName(); 
    StringBuilder output = new StringBuilder(); 
    Byte[] publicKey = assmName.GetPublicKey(); 

    foreach(Byte byte in publicKey) 
    { 
     output.Append(byte.ToString("x").PadLeft(2, '0')); 
    } 

    return output.ToString(); 
} 
+0

我需要嘗試了這一點標記這是一個有效的答案之前,但這個看起來明智的。 – Mathias 2009-10-09 02:01:47

+0

您也可以使用URL作爲證據,並將URL設置爲您的安裝目錄。從而給該文件夾FullTrust中的所有程序集。我不推薦這個。有人可能會在您的安裝文件夾中放置惡意程序集,使其完全信任,然後有人可能會因爲創建漏洞而責怪您。如果有人提出這個建議,我只會提到這一點,這樣你就能明白爲什麼這不是一個好主意。 – HackedByChinese 2009-10-09 03:45:59

+0

謝謝,我相信它的工作原理。實際上,我在msdn論壇上發現了這篇文章,它提出了對SetSecurity項目的小修改,允許添加逗號分隔的dll列表而不是單個dll(線程中的Lex007文章)。這樣,你不必共享相同的密鑰。 http://social.msdn.microsoft.com/forums/en-US/vsto/thread/cec6abb6-4716-4bde-91f2-25fb68abd54e/ – Mathias 2009-10-12 23:16:04

相關問題