c# – 何时使用GAC?

我是新手使用GAC,我正在尝试处理你应该和不应该使用它的时间.这是我的情况:

我开发的软件主要是另一个商业产品的插件,以便产品将我的产品加载到它的代码中.我开发了几个由我的所有应用程序(例如我的许可证模块)使用的程序集.这些库的.dll文件安装到主应用程序目录,以便父程序从那里加载它们.

问题是当用户安装了两个软件标题时,可能会发生冲突,因为父程序只加载它找到的程序集的第一个副本,而不管版本如何.因此,如果他们的软件A版本1.0中包含License1.0.dll,而软件B版本2.5中包含许可证2.0,其中包含与License1.0.dll不同的方法和/或参数,则它只加载1.0然后抛出异常软件B因为找不到合适的许可方法.

在最初的研究中,似乎GAC的目的是为了解决这个问题,而且有几个网站似乎都是这样,但后来我也找到了this subject,而答案中的链接似乎是说不会不使用GAC.

我糊涂了.有人可以直接指导我是否应该考虑使用GAC吗?

解决方法:

我完全不建议使用GAC,因为你依赖注册的dll而且我经常遇到问题.无论如何,您可以手动加载您喜欢的程序集.我有一个64位或32位的父应用程序,我必须加载相应的SQLite x64或x86 DLL.
引用的程序集具有copy local false.这是运行时寻找解析引用的第一个地方.如果有什么,那么它会检查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包现在处理这个问题.但是当我们想要使用它时它不可用.

上一篇:在一台计算机上使用相同python版本的多个Python安装


下一篇:mysql 5.7.12 – 禁用only_full_group_by sql_mode并不完全成功