GetCallingAssembly在受到visual studio和单机版攻击时有所不同
本文关键字:单机版 攻击 有所不同 studio visual GetCallingAssembly | 更新日期: 2023-09-27 18:00:42
我在GetCallingAssembly中遇到了一个奇怪的问题。。。我有一个主要的WPF应用程序,它从不同的程序集加载数据,查看实现的接口。当我在VS(release)下执行代码时,我得到了正确的callingassembly(例如模块、日历、模块、报告等)。当我从独立(发行版)运行它时,我得到了指向主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;
}
}
我做错了什么?感谢
这个问题可能是内联方法的一些意外行为。
从MSDN上阅读:
如果调用GetCallingAssembly方法的方法由实时(JIT)编译器以内联方式展开,或者如果其调用程序以内联方式扩展,则GetCallingAssembly返回的程序集可能会意外不同。
源
您可以尝试使用ImplOptions.NoInlinein:装饰该方法
[MethodImpl(MethodImplOptions.NoInlining)]
public virtual Task<MenuItemNode> RegisterMenu(ICollection<string> functions)
但如果返回值是Task<T>
,我不确定它是否能正常工作。在调试模式下运行时,您没有看到它的原因是JIT在调试模式中没有内联方法。