我是使用 GAC 的新手,我正在尝试了解何时应该和不应该使用它。这是我的情况:
我开发的软件主要是另一个商业产品的插件,以便产品将我的产品加载到它的代码中。我开发了几个程序集,用于我的所有应用程序(例如我的许可证模块)。这些库的 .dll 文件安装到主应用程序目录,以便父程序从那里加载它们。
问题是当用户安装了我的两个软件标题时,可能会发生冲突,因为父程序只加载它找到的程序集的第一个副本,而不管版本如何。因此,如果他们有包含 License1.0.dll 的软件 A 版本 1.0 和包含许可证 2.0 的软件 B 版本 2.5,其中的方法和/或参数与 License1.0.dll 不同,那么它只会加载 1.0,然后在软件 B,因为它找不到正确的许可方法。
在最初的研究中,似乎 GAC 旨在成为这个问题的答案,并且几个网站似乎都这么说,但后来我也发现 this subject 和答案中的链接似乎在说不,不要为此使用 GAC。
我很困惑。有人可以就我是否应该为此考虑使用 GAC 提供一些直接指导吗?
最佳答案
我根本不建议使用 GAC,因为您依赖于注册的 dll,而且我经常遇到问题。无论如何,您可以手动加载您喜欢的程序集。我有一个 64 位或 32 位的父应用程序,我必须加载相应的 SQLite x64 或 x86 dll。
引用的程序集具有复制本地错误。这是运行时将查找解析引用的第一个位置。如果有任何内容,则它会检查 GAC。 dll 未在那里注册,因此 AssemblyResolve 事件将发生在我可以说出我想要加载的内容的地方:
AppDomain.CurrentDomain.AssemblyResolve += ResoveAssembly;
private static Assembly ResoveAssembly(object sender, ResolveEventArgs e)
{
string fullPath = Assembly.GetExecutingAssembly().Location;
string path = Path.GetDirectoryName(fullPath);
if (e.Name.StartsWith("System.Data.SQLite"))
{
return Assembly.LoadFrom(Path.Combine(path, Environment.Is64BitProcess
? "x64\\System.Data.SQLite.DLL"
: "x86\\System.Data.SQLite.DLL"));}
return null;
}
}
如果有人想知道我为什么这样做:据我所知,新的 SQLite NuGet 包现在可以处理这个问题。但是当我们想使用它时它不可用。
关于c# - 何时使用 GAC?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26724995/