2013-10-03 30 views
0

我遇到這個問題,當我有WPF UserControls並且我有這個UserControl位於加載到Assembly中的不同版本的DLL時,UserControl無法再找到它的資源。 (也許因爲他們在那裏有相同的名稱,但在不同的版本化DLL中)任何知道如何解決它?WPF-在UserControls中使用不同版本的DLL

回答

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); 
      } 
     } 
    } 
}