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包现在处理这个问题.但是当我们想要使用它时它不可用.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...