2015-07-01 1 views
0

У меня странная проблема с GetCallingAssembly ... У меня есть основное приложение WPF, которое загружает данные из разных сборок, просматривающих реализованный интерфейс. Когда я выполняю код под VS (выпуск), я получил правильную сборку вызовов (например, Modules.Calendar, Modules.Reporting и т. Д.). Когда я запускаю его из автономного (выпуск), я получил CallingAssembly, который указывает на exe основного приложения WPF, и поэтому он не будет корректно выполнять свои обязанности (что в данном конкретном случае - загрузка элементов меню)GetCallingAssembly отличается при атаке на визуальную студию против автономного

Каждый модуль реализует следующий код

public class MenuRegisterService : MenuRegisterServiceBase 
{ 
Assembly.GetCallingAssembly() correctly filled 
    public override Task<MenuItemNode> RegisterMenu(ICollection<string> functions) 
    { 
     return base.RegisterMenu(functions); 
    } 
} 

и вот метод Base

public virtual Task<MenuItemNode> RegisterMenu(ICollection<string> functions) 
    { 

     try 
     { 
      var assembly = Assembly.GetCallingAssembly(); //I should get the module that invoked the base class 

      log.Info("->" + assembly.FullName); 
      string filename = GetFullFileName(assembly, MenuFilename); 

      return Task.Factory.StartNew(() => 
      { 
       string xmlFileName = string.Format(filename); 

       var doc = new XmlDocument(); 

       using (Stream stream = assembly.GetManifestResourceStream(xmlFileName)) 
       { 
        if (stream != null) 
        { 
         using (var reader = new StreamReader(stream)) 
         { 
          doc.LoadXml(reader.ReadToEnd()); 
         } 
        } 
       } 

       MenuItemNode menu = BuildMenu(doc.SelectSingleNode(@"/Node"), functions); 

       return menu; 
      }); 
     } 
     catch (Exception ex) 
     { 

      log.Error(ex); 
      return null; 
     } 
    } 

Что я делаю неправильно? Thanks

ответ

1

Проблема может быть неожиданным поведением с помощью встроенных методов.

Прочитайте это из MSDN:

Если метод, который вызывает метод GetCallingAssembly расширяется встроенный в точно в срок (JIT) компилятор, или если его абонент расширяется рядный, узел, который возвращенный GetCallingAssembly может неожиданно отличаться.

Source

Вы можете попробовать украшения метод с ImplOptions.NoInlining:

[MethodImpl(MethodImplOptions.NoInlining)] 
public virtual Task<MenuItemNode> RegisterMenu(ICollection<string> functions) 

Но я не уверен, если он будет работать правильно, если возвращаемое значение является Task<T>. Причина, по которой вы не видите ее при работе в режиме отладки, заключается в том, что JIT не использует встроенные методы в режиме отладки.

Смежные вопросы