我遇到了一个奇怪的GetCallingAssembly问题...我有一个主要的WPF应用程序,它从不同的程序集中查看已实现的接口。 当我在VS(发布)下执行代码时,我得到了正确的调用程序集 (例如Modules.Calendar,Modules.Reporting等)。 当我从独立(发布)运行它时,我得到指向主WPF应用程序的exe的CallingAssembly,因此它将无法正确执行它的职责(在这种特定情况下是加载菜单项)
每个模块实现以下代码
public class MenuRegisterService : MenuRegisterServiceBase
{
Assembly.GetCallingAssembly() correctly filled
public override Task<MenuItemNode> RegisterMenu(ICollection<string> functions)
{
return base.RegisterMenu(functions);
}
}
这是基本方法
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;
}
}
我做错了什么? 感谢
答案 0 :(得分:1)
问题可能是内联方法的一些意外行为。
从MSDN阅读:
如果调用GetCallingAssembly方法的方法由实时(JIT)编译器内联扩展,或者其调用者是内联扩展的,则GetCallingAssembly返回的程序集可能会意外地出现差异。
您可以尝试使用ImplOptions.NoInlining:
来修饰方法[MethodImpl(MethodImplOptions.NoInlining)]
public virtual Task<MenuItemNode> RegisterMenu(ICollection<string> functions)
但如果返回值为Task<T>
,我不确定它是否能正常工作。在调试模式下运行时没有看到它的原因是因为JIT没有在调试模式下内联方法。