代码之家  ›  专栏  ›  技术社区  ›  Mathias

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

  •  2
  • Mathias  · 技术社区  · 15 年前

    我已经用vsto编写了一些Excel2003/2007外接程序,我通常会在vsto项目中引用.NET dll(通常是在项目之间重用代码)。
    我遇到了以下问题。虽然对dll的调用在调试模式或开发计算机上工作正常,但当我通过MSI安装程序部署外接程序时,dll会添加到外接程序的文件夹中,但外接程序似乎无法调用dll。
    经过一些努力,我找到了一种解决方法:在向外接程序授予安全性的安装程序中的自定义操作的基础上,我添加了另一个向外接程序引用的每个DLL授予安全性的自定义操作,如下所述的步骤
    http://msdn.microsoft.com/en-us/library/bb332052.aspx

    我的问题是,虽然它有效,但我不相信我做得对。这是非常乏味的,我也得到了一个警告,当我建立,这是从我所能做的,实际上是指,安全是两次授予在同一地点。
    这里的任何人都能告诉我我做得对与否,如果有更好的方法,那是什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   moribvndvs    15 年前

    在我的例子中,我在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." . 这使具有该公钥的所有库都完全信任。

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