由于同一程序集的不同版本,Visual C#项目无法运行

发布于 2024-10-15 09:35:20 字数 357 浏览 4 评论 0原文

我的 C# 应用程序使用两个不同的预打包解析器,每个解析器使用不同的 Antlr.Runtime.dll 强版本。

应用程序抛出 FileLoadException,显然是因为它仅正确加载了其中一个版本,而无法找到另一个版本。

\bin\x86\Debug 目录仅包含 dll 的一份副本。

请注意,我无法使用程序集别名,因为我的代码不直接调用版本化程序集 - 它们只是通过解析器程序集间接调用。

这是指示 Visual Studio 将不同版本的 dll 放置在单独的目录中的问题,因为它们具有相同的名称?我想尽可能避免使用 GAC。

我读过很多“并排”和相关文章,但似乎没有一个解决这个问题。

My c# application uses two different pre-packaged parsers, that each use a different strong version of Antlr.Runtime.dll.

The application throws a FileLoadException, apparently because it correctly loaded only one of the versions and could not find the other.

The <app>\bin\x86\Debug directory contains only one copy of the dll.

Note that I cannot use assembly aliases since my code doesn't directly call the versioned assemblies - they are only indirectly called via the parser assemblies.

Is this a matter of instructing Visual Studio to place the differently versioned dlls in separate directories since they have the same name? I'd like to avoid using the GAC as far as possible.

I've read many "side by side" and related articles, but none seem to address this question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝海 2024-10-22 09:35:20

我绝不是 SxS 专家,但在我的公司,当发生这种情况时,他们会为每个程序集创建一个不同的文件夹,并创建一个清单来加载它们。

I'm in no way a SxS expert but at my company when this happens they create a different folder for each assembly and a manifest to load them.

愿得七秒忆 2024-10-22 09:35:20

通过挂钩 AppDomain.AssemblyResolve 解决了这个问题:

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
    Assembly result = null;

    if (e.Name ==
        @"Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7")
        result = Assembly.LoadFile(
             @"C:\src\NHibernate-3.0.0.GA\lib\net\3.5\Antlr3.Runtime.dll");

    return result;
};   

Solved this problem by hooking AppDomain.AssemblyResolve:

AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{
    Assembly result = null;

    if (e.Name ==
        @"Antlr3.Runtime, Version=3.1.3.42154, Culture=neutral, PublicKeyToken=3a9cab8f8d22bfb7")
        result = Assembly.LoadFile(
             @"C:\src\NHibernate-3.0.0.GA\lib\net\3.5\Antlr3.Runtime.dll");

    return result;
};   
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文