WPF - 在UserControls中使用不同版本的DLL

时间:2013-10-03 07:11:04

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

我有问题,当我有WPF UserControls并且我有这个UserControl位于装入程序集的不同版本中的DLL时,UserControl再也找不到它的资源了。 (也许是因为它们具有相同的名称,但在不同的Versioned DLL中)任何人都知道如何修复它?

3 个答案:

答案 0 :(得分:0)

我通过更改DLL中的“IntializeComponent”方法自己找到了一种方法。这构建一个URI,然后借用XAML。问题是,在URI中,版本不包括在内!所以我创建了一个小应用程序,我在编译过程之后调用,它修改了DLL,以便包含它的Version String!为此,它使用的是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);
            }
        }
    }
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)