0

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

4

3 回答 3

0

通过更改 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);
            }
        }
    }
}
于 2013-10-03T07:11:03.777 回答
0

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

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

于 2014-11-01T13:28:50.597 回答
0

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

于 2014-12-27T14:13:05.997 回答