我正在使用默认安装SDK的许多第三方程序集。但是,当使用Reflection时,.NET崩溃并出现以下错误“无法加载文件或程序集[Name.dll]”。所以我发现有3个解决方案:
打开“本地副本”,这会强制编译器将所有程序集复制到构建文件夹(显着增加文件大小)
直接编译到第三方Program Files文件夹,让.NET运行时轻松找到程序集(因为它们位于同一文件夹中)。这使得管理安装变得更加困难,有2个应用程序共享一个公共文件夹。
将大多数第三方程序集添加到GAC(使用gacutil)并使用其强名称引用它。但这会触发另一种“找不到文件”错误,可能程序集无法完全从GAC运行,因为它需要来自其本机Program Files目录的一些文件。
所以我想知道是否有办法提示.NET运行时的第三方程序集目录路径,因此我可以在其他地方编译我的应用程序,而不是被迫携带第三方程序集的包袱。 (它们已经安装在最终用户计算机上)
答案 0 :(得分:1)
这些程序集不能在服务器或计算机上进行GAC, 或者你可以为你的应用程序创建一个.MSI安装程序并引入版本控制吗?只是一个想法。
答案 1 :(得分:1)
如果程序集位于网络文件夹中,则.NET默认安全性不会加载它们。您需要调整.NET配置控制面板下的安全设置,在"运行时安全策略"有向导"调整区域安全"然后选择"本地互联网"与"完全信任"。
答案 2 :(得分:1)
由于程序集当前位于单独的“共享”目录中,这意味着它们可以独立于引用它们的程序进行版本控制。 “复制本地”比这里更好,否则你可能会在不知情的情况下换掉不兼容版本的旧“DLL地狱”。
GAC旨在解决这个问题,但当然您需要使用强命名,并且您需要他们引用的所有程序集都具有强名称,并且也需要加入GAC。这为管理版本控制和安装创建了额外的工作,但它确实允许并行版本控制并防止重复。尽管如此,如果您只引用一些应用程序中的程序集,那么将它放入GAC可能就是一种杀手锏。实际上,由于更新期间版本的累积,实际上最终会占用更多的磁盘空间,而Copy Local只会为每个应用程序加载一个版本。