我有问题,当我有WPF UserControls并且我有这个UserControl位于装入程序集的不同版本中的DLL时,UserControl再也找不到它的资源了。 (也许是因为它们具有相同的名称,但在不同的Versioned DLL中)任何人都知道如何修复它?
答案 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)
我现在通过这种方式在SharpDevelop中修复它:https://github.com/icsharpcode/SharpDevelop/commit/b3ea4a0efb7e3b8e083f8be40ea6f7e03ff44604