攻击到visual studio vs Standalone时,GetCallingAssembly会有所不同

时间:2015-07-01 12:35:49

标签: c# wpf

我遇到了一个奇怪的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;
        }
    }

我做错了什么? 感谢

1 个答案:

答案 0 :(得分:1)

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

从MSDN阅读:

  

如果调用GetCallingAssembly方法的方法由实时(JIT)编译器内联扩展,或者其调用者是内联扩展的,则GetCallingAssembly返回的程序集可能会意外地出现差异。

Source

您可以尝试使用ImplOptions.NoInlining:

来修饰方法
[MethodImpl(MethodImplOptions.NoInlining)]
public virtual Task<MenuItemNode> RegisterMenu(ICollection<string> functions)

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