簡體   English   中英

遭到Visual Studio攻擊與獨立攻擊時,GetCallingAssembly有所不同

[英]GetCallingAssembly different when attacked to visual studio vs standalone

我在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);
    }
}

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

我究竟做錯了什么? 謝謝

該問題可能是內聯方法的某些意外行為。

從MSDN閱讀:

如果通過實時(JIT)編譯器內聯擴展了調用GetCallingAssembly方法的方法,或者如果內聯擴展了其調用方,則GetCallingAssembly返回的程序集可能會意外地不同。

資源

您可以嘗試使用ImplOptions.NoInlining裝飾該方法:

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

但是我不確定如果返回值是Task<T>它是否可以正常Task<T> 在調試模式下運行時看不到它的原因是因為JIT不在調試模式下內聯方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM