Excel 如何将引用的程序集添加到VSTO项目的部署中?

Excel 如何将引用的程序集添加到VSTO项目的部署中?,excel,deployment,vsto,Excel,Deployment,Vsto,我已经使用VSTO编写了一些Excel 2003/2007外接程序,最后通常会引用VSTO项目中的.NET dll(通常是跨项目重用的代码)。 我遇到了以下问题。虽然对dll的调用在调试模式下或在开发机器上可以完美地工作,但当我通过msi安装程序部署外接程序时,dll被添加到外接程序的文件夹中,但外接程序似乎无法调用dll。 经过一些努力,我找到了一种解决方法:在安装程序中为外接程序授予安全性的自定义操作的基础上,我按照 我的问题是,虽然它有效,但我不相信我做得对。这是非常乏味的,而且我在构建

我已经使用VSTO编写了一些Excel 2003/2007外接程序,最后通常会引用VSTO项目中的.NET dll(通常是跨项目重用的代码)。
我遇到了以下问题。虽然对dll的调用在调试模式下或在开发机器上可以完美地工作,但当我通过msi安装程序部署外接程序时,dll被添加到外接程序的文件夹中,但外接程序似乎无法调用dll。
经过一些努力,我找到了一种解决方法:在安装程序中为外接程序授予安全性的自定义操作的基础上,我按照

我的问题是,虽然它有效,但我不相信我做得对。这是非常乏味的,而且我在构建时也会收到一个警告,我所能做的实际上是指向在同一位置两次授予安全性的事实。

这里的任何人都可以告诉我我做的是否正确,如果有更好的方法,还有什么更好的方法?

在我的情况下,我在MyCompany.Office下有一套加载项

我有一个名为MyCompany.Office.dll的核心功能共享库,MyCompany.Office.Word.dll和MyCompany.Office.Excel.dll引用了该库,它们都是外接程序(您可以轻松地拥有多个Excel外接程序,而不是一个Word外接程序和一个Excel外接程序,或者任何您想要的外接程序)

我所做的是为解决方案创建一个强名称密钥文件,并将其链接到所有三个项目中。然后,我用相同的强名称keyfile对所有三个库进行签名

然后,我创建了一个安装程序操作,该操作使用公钥(而不是文件位置)作为证据添加CAS条目。因此,我的自定义操作最终调用
caspol.exe-m-q-ag“my_Computer_Zone”-strong-hex-noname-noversion FullTrust-n“MyCompany_Office”-d“MyCompany.Office加载项的代码组”。
。这使具有该公钥的所有库都完全信任

通过打开命令提示符,导航到keyfile位置并键入
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();
}

在将其标记为有效答案之前,我需要尝试一下,但这看起来很合理。您也可以使用URL作为证据,并将URL设置为您的安装目录。从而使该文件夹中的所有程序集都具有完全信任。不过我不推荐这个。有人可能会在您的安装文件夹中删除恶意程序集,给予它完全信任,然后有人可能会责怪您创建了漏洞。我只是在有人建议的情况下才提到这一点,这样你就能明白为什么这不是一个好主意。谢谢,我相信它是有效的。我实际上在msdn论坛上找到了这篇文章,它建议对SetSecurity项目进行一个小的修改,允许添加一个逗号分隔的dll列表,而不是一个dll(线程中的Lex007帖子)。这样,您就不必共享同一个密钥。