【问题标题】:WPF - Use different Versions of DLLs with UserControlsWPF - 通过用户控件使用不同版本的 DLL
【发布时间】:2013-10-03 07:11:03
【问题描述】:

我有问题,当我有 WPF 用户控件并且我有这个用户控件位于不同版本的 DLL 加载到程序集中时,用户控件再也找不到它的资源。 (可能是因为它们的名称相同,但在不同的版本化 DLL 中)知道如何修复它吗?

【问题讨论】:

    标签: wpf user-controls version .net-assembly


    【解决方案1】:

    我自己找到了一种方法,通过更改 DLL 中的“IntializeComponent”方法。这将构建一个 URI,然后加载 XAML。问题是,在 URI 中,版本不包括在内!所以我创建了一个小应用程序,我在编译过程之后调用它,它修改了 DLL 以便包含它的版本字符串!为此,它使用 Mono.Cecil...

    代码如下:

    class Program
    {
        static void Main(string[] args)
        {            
            var path = Environment.CurrentDirectory;
    
            if (args != null && args.Count() > 0)
                path = args[0];
    
            var dlls = Directory.GetFiles(path, "*.dll");
    
            foreach (var dll in dlls)
            {
                bool dllChanged = false;
    
                var ver = AssemblyName.GetAssemblyName(dll).Version;
                var nm = AssemblyName.GetAssemblyName(dll).Name;
                var oldTxt = "/" + nm + ";";
                var newTxt = "/" + nm + ";v" + ver.ToString() + ";";
    
                var readerParameters = new ReaderParameters {ReadSymbols = true};
                var assemblyDefinition = AssemblyDefinition.ReadAssembly(dll, readerParameters);
    
                var methodDefinition =
                    assemblyDefinition.MainModule.Types.SelectMany(x => x.Methods)
                        .Where(x => x.Name == "InitializeComponent");
    
                foreach (var def in methodDefinition)
                {
                    for (int n = 0; n < def.Body.Instructions.Count; n++)
                    {
                        var instr = def.Body.Instructions[n];
    
                        if (instr.OpCode == OpCodes.Ldstr && instr.Operand is string &&
                            ((string) instr.Operand).StartsWith(oldTxt))
                        {
                            var next = def.Body.Instructions[n + 1];
    
                            if (next.OpCode == OpCodes.Ldc_I4_2)
                            {
                                var op = ((string) instr.Operand);
                                op = op.Replace(oldTxt, newTxt);
                                instr.Operand = op;
    
                                dllChanged = true;
                            }
                        }
                    }
                }
    
                if (dllChanged)
                {
                    var writerParameters = new WriterParameters {WriteSymbols = true};
                    assemblyDefinition.Write(dll, writerParameters);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      与此类似: https://stackoverflow.com/a/26689750/195275

      但答案不需要更改 IL 代码。您可以将 /p:AssemblyVersion 传递给 msbuild。

      【讨论】:

        【解决方案3】:

        我现在以这种方式在 SharpDevelop 中修复了它:https://github.com/icsharpcode/SharpDevelop/commit/b3ea4a0efb7e3b8e083f8be40ea6f7e03ff44604

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-15
          • 2018-03-25
          • 2021-08-10
          • 2011-01-01
          • 1970-01-01
          相关资源
          最近更新 更多