c# - 如何手动编辑 Visual Studio 项目的 list 以明确指定引用的程序集?

标签 c# visual-studio-2010 compilation dependencies manifest

由于 log4net 的强大命名和版本控制非常令人头疼,即旧的 1.2.10 名称、新的 1.2.11 名称,以及(老天保佑)SAP 制作并插入 GAC 的 1.2.10它自己的强名称,我的应用程序将拒绝在除我自己的机器之外的任何机器上运行。它一直在寻找强命名的 SAP 版本的 1.2.11 版本,但该版本不存在。

因为我的项目中没有任何东西是强命名的,所以我想阻止编译器寻找强命名的程序集,而只加载我放在目录中的程序集。由于它提示 list 不匹配,我试图在我的项目中找到该版本和公钥的引用,但我没有找到。看起来这个 list 是在编译时创建的。

我怎样才能覆盖它?是否有属性、开关或条件编译可用于准确指定我希望引用的程序集?

最终我想使用1.2.11版本的log4net,并强制程序集忽略GAC中的版本,只在本地bin目录中查找。这真的不应该这么痛苦。

最佳答案

运行时指令

在运行时,您可以使用 AppDomain.AssemblyResolve解决程序集版本控制问题,当您不关心当前的特定版本时,您只想加载/bin 文件夹中的内容。此代码是使用 inspiration from here 创建的.

string[] ignoreAssembyVersions = new string[] { "log4net" };
AppDomain.CurrentDomain.AssemblyResolve += (_, assembly) =>
{
    //ignore the vesion number and return any version that has been loaded
    var name = new AssemblyName(assembly.Name);
    var shortName = name.Name; // retrieve short name
    if (ignoreAssembyVersions.Contains(shortName)) // compare against list of assemblies we ignore revisions for
    {
        // check if this assembly is already loaded under a different version #
        Assembly[] allAss = AppDomain.CurrentDomain.GetAssemblies();
        List<Assembly> list = new List<Assembly>(allAss);
        var loadedAssembly = list.Find(ass => new AssemblyName(ass.FullName).Name == shortName); // check if we have any version loaded yet
        if (loadedAssembly != null)
            return loadedAssembly;
        else // assembly has not yet been loaded in this domain
        {   // probe for assembly by name
            Assembly probedAssembly = Assembly.LoadFrom(string.Format("{0}.dll", shortName)); // probe for any match on assembly.dll 
            return probedAssembly;
        }
    }
    return null; // ignore binding failure -> pass up the stack
};

处理 AssemblyResolve 事件的替代方法是 use a custom bindingRedirect policy .但是 - 这仅在您知道 /bin 中存在什么版本或当前加载到 App Domain 中时才有效。

构建时指令

如果你想控制which assembly version is used at build-time , 您可以使用 Specific Version='true'对于您添加的程序集引用。

关于c# - 如何手动编辑 Visual Studio 项目的 list 以明确指定引用的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093169/

相关文章:

c# - C++-CLI 包装一组成员

C++ 模板的模板编译失败

c++ - 是否可以在没有任何库的情况下编译 C++?

C# 从字符中删除重音?

c# - 有没有办法在 .NET Core 日志记录中格式化输出格式?

C# 数据表和 PK

c++ - 英特尔 TBB 集成问题 - Google 测试项目中的 VS2013 编译错误

visual-studio-2010 - 在 VS2010 调试器中获取未处理的异常,即使异常已处理

c# - Multiview.ActiveViewIndex 仅更改一次(或者如果 autopostback 为 false)

windows - Go test编译成功,但是go build没有