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

我做错了什么?感谢

GetCallingAssembly在受到visual studio和单机版攻击时有所不同

这个问题可能是内联方法的一些意外行为。

从MSDN上阅读:

如果调用GetCallingAssembly方法的方法由实时(JIT)编译器以内联方式展开,或者如果其调用程序以内联方式扩展,则GetCallingAssembly返回的程序集可能会意外不同。

您可以尝试使用ImplOptions.NoInlinein:装饰该方法

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

但如果返回值是Task<T>,我不确定它是否能正常工作。在调试模式下运行时,您没有看到它的原因是JIT在调试模式中没有内联方法。