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