由于同一程序集的不同版本,Visual c#project无法运行

由于同一程序集的不同版本,Visual c#project无法运行,c#,visual-studio,side-by-side,C#,Visual Studio,Side By Side,我的c#应用程序使用两个不同的预打包解析器,每个解析器使用不同的强大版本的Antlr.Runtime.dll 应用程序抛出FileLoadException,显然是因为它只正确加载了其中一个版本,而找不到另一个版本 \bin\x86\Debug目录只包含dll的一个副本 请注意,我不能使用程序集别名,因为我的代码不直接调用版本化的程序集-它们仅通过解析器程序集间接调用 这是不是指示VisualStudio将不同版本的DLL放在不同的目录中,因为它们具有相同的名称?我想尽量避免使用GAC 我读过很

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

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

\bin\x86\Debug目录只包含dll的一个副本

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

这是不是指示VisualStudio将不同版本的DLL放在不同的目录中,因为它们具有相同的名称?我想尽量避免使用GAC


我读过很多《肩并肩》和相关文章,但似乎没有人能解决这个问题。

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

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

通过挂接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;
};   

通过挂接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;
};   

GAC就是为了解决这个问题而成立的。需要30秒。实现AppDomain.AssemblyResolve并编写生成后事件以将副本放在单独的目录中需要更长的时间。@hans-这会破坏xcopy部署。我觉得尝试使用同一程序集的不同版本会破坏这一点。否则,Xcopy复制子目录/s选项不会有问题。关键是GAC部署与Xcopy部署不同。使用xcopy部署,您可以复制一个目录,应用程序就可以运行了。您的建议要求安装程序(无论多么简单)将程序集注册到GAC中。可以想象,App.Main()可以在第一次启动时执行此操作,但这并不比下面的代码简单。还是我遗漏了什么?:)GAC就是为了解决这个问题而成立的。需要30秒。实现AppDomain.AssemblyResolve并编写生成后事件以将副本放在单独的目录中需要更长的时间。@hans-这会破坏xcopy部署。我觉得尝试使用同一程序集的不同版本会破坏这一点。否则,Xcopy复制子目录/s选项不会有问题。关键是GAC部署与Xcopy部署不同。使用xcopy部署,您可以复制一个目录,应用程序就可以运行了。您的建议要求安装程序(无论多么简单)将程序集注册到GAC中。可以想象,App.Main()可以在第一次启动时执行此操作,但这并不比下面的代码简单。还是我遗漏了什么?:)这很好,只是在源代码中有dll文件的物理路径。我个人会用索莫斯写的东西。应该可以在没有C#编程的情况下配置这些东西。这很好,只是您在源代码中有指向dll文件的物理路径。我个人会用索莫斯写的东西。不需要C#编程就可以配置这些东西。