微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐