我们的一个合作伙伴为我们提供了一个我们需要从我们的应用程序访问的程序集。不幸的是,这不是强名称,因此我们无法将其安装到 GAC。而且我们不能把它和我们的可执行文件放在同一个地方。
有解决方案吗?
编辑:这将是仅用于测试的临时解决方案,当他们使用 RC 时,我们将拥有一个强名称程序集。
那时你有几个选择。
第一种是将程序集放在具有程序集名称(不带扩展名)的目录中,该目录是应用程序目录的子目录。
第二个是指定您希望 CLR 使用探测元素探测app.config 文件中的引用的子目录。
最后,您可以使用Assembly 类上的各种 Load 方法动态加载程序集,但我会说在这种情况下这是一个非常糟糕的主意,因为您拥有程序集,并且您有要在其中使用的具体类型。当您想要替换某些抽象的实现时,通常会使用像这样的后期程序集加载,这里似乎不是这种情况。
使用反编译和签名的解决方法(使用 Visual Studio 的开发人员命令提示符):
ildasm.exe /all /typelist /out=DataSystem.il DataSystem.dll
ilasm.exe /dll /optimize /key=DataSystem.snk DataSystem.il
DataSystem.snk 可以使用 Visual Studio IDE 生成为文件 http://www.bloggedbychris.com/2011/09/29/signing-a-net-assembly-in-visual-studio/
那么你应该可以运行
gacutil.exe -i DataSystem.dll
另一个解决方案是将以下内容添加到 machine.config 文件中:
<runtime>
<developmentMode developerInstallation="true"/>
</runtime>
并将 DEVPATH = path 添加到系统环境变量。
我发现的签署和注册程序集的最佳和最直接的解决方案是:http: //codeingaddiction.blogspot.com/2011/06/how-to-add-strong-name-to-existing-dll_16.html
为了让我可以轻松地工作,我 CD 到某个目录,如 C:\temp - 这对我来说似乎工作得更好,可能是因为在这样的地方更容易访问文件权限。