我使用VSTO编写了一些Excel 2003/2007加载项,我通常最终在VSTO项目中引用.NET dll(通常是我在项目中重用的代码)。
我遇到了以下问题。虽然对dll的调用在调试模式或开发机器上完美运行,但是当我通过msi安装程序部署加载项时,dll会添加到加载项的文件夹中,但加载项不会似乎能够调用dll
经过一番努力,我找到了解决这个问题的方法:在安装程序的自定义操作授予加载项安全性的基础上,我添加了另一个自定义操作,为加载项引用的每个单独的dll授予安全性,遵循这些步骤在中描述
http://msdn.microsoft.com/en-us/library/bb332052.aspx
我的问题是,虽然它有效但我不相信我做得对。这是非常繁琐的,我在构建时也会收到警告,从我可以做的事实上,它实际上指的是安全性在同一位置被授予两次。
这里的任何人都可以告诉我,我做得对不对,有什么更好的方法,如果有的话?
答案 0 :(得分: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();
}