在.NET 3.5和更低的,以下(略粗例如)工作得很好:如何可靠地確定在.NET調用組件4.0
組件A:
public static class ClassInAssemblyA
{
public static string GetCallingAssemblyLocation()
{
return System.Reflection.Assembly.GetCallingAssembly().GetName(false).CodeBase;
}
}
大會B:
public class ClassInAssemblyB
{
public string AssemblyName { get; private set; }
public ClassInAssemblyB()
{
AssemblyName = ClassInAssemblyA.GetCallingAssemblyLocation();
}
}
大會C:
var assemblyName = new ClassInAssemblyB().AssemblyName;
Assert.That(assemblyName.Contains("AssemblyB"));
不幸的是,.NET 4.0 CLR似乎被優化爲將AssemblyA代碼內聯到AssemblyB,因此上述測試實際上在調試模式下執行時會通過,但在發佈模式中失敗。在逐步完成時再現錯誤基本上是不可能的。
停止內聯的一種方法是要求調用者每次參考AssemblyA時都添加屬性[MethodImpl(MethodImplOptions.NoInlining)]
。這是一個需要調用者瞭解庫的內部工作的解決方案,它不應該是他們的問題,所以我不願意走這條路。
有沒有其他方法可以在運行時找出調用程序集文件名是什麼?
爲什麼你需要知道調用程序集? –