[英]Visual Studio Extension not working if compile with different VS
[英]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.