2009-06-11 100 views

回答

112
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 
+7

這個往往會添加「.vhost」。在文件名中,如果使用System.Reflection.Assembly.GetEntryAssembly()。位置(請參閱備用答案),則不存在問題。 – Contango 2012-08-02 15:59:25

+4

@Contango,這是由VS中使用「Visual Studio宿主進程」造成的。 – LuddyPants 2014-02-05 01:35:28

+0

適用於VS 2012中的單元測試。 過程名稱:vstest.executionengine.x86 配置文件:C:\ TFS \ Tests \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName:C:\ PROGRAM FILES(X86)\ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName:vstest.executionengine.x86.exe FriendlyName :UnitTestAdapter:運行測試 – Kiquenet 2014-03-26 08:07:57

7

我想這應該是你想要什麼:

System.Reflection.Assembly.GetEntryAssembly().Location 

這將返回在進程啓動時首先加載的程序集,這似乎是你想要的。因爲它返回包含調用堆棧中立即更高的方法的程序集(即它可能位於同一個DLL中),因此在一般情況下,您不一定會返回所需的程序集。

+0

我不確定GetCallingAssembly() - 是否返回包含調用方法的程序集(調用堆棧中的一個)?這可能是圖書館而不是可執行文件。 – 2009-06-11 09:42:11

+0

@Martin:是的,你說得對。在某些情況下,GetCallingAssembly可能適用/適用,但似乎他希望在此處使用GetEntryAssembly。 – Noldorin 2009-06-11 09:45:11

3

Assembly.GetEntryAssembly()

70

如果你想可執行文件:

System.Reflection.Assembly.GetEntryAssembly().Location 

如果你想多數民衆贊成消耗你的庫(這可能是相同的組件如上,如果您的代碼直接調用的組件從您的可執行文件中的類):

System.Reflection.Assembly.GetCallingAssembly().Location 

如果你LIK Ë只是文件名不是路徑,使用:

Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location) 
40

除了以上問題的答案。

我寫了下面的test.exe作爲控制檯應用程序

static void Main(string[] args) { 
    Console.WriteLine(
    System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName); 
    Console.WriteLine(
    System.Reflection.Assembly.GetEntryAssembly().Location); 
    Console.WriteLine(
    System.Reflection.Assembly.GetExecutingAssembly().Location); 
    Console.WriteLine(
    System.Reflection.Assembly.GetCallingAssembly().Location); 
} 

然後我編譯了該項目,並更名其輸出到test2.exe文件。輸出線是正確的並且是相同的。

但是,如果我在Visual Studio中啓動它,結果是:

d:\ test2.vhost.exe

d:\ test2.exe

d:\ test2.exe

C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ mscorlib.dll中

Visual Studio的ReSharper插件強調了

System.Diagnostics.Process.GetCurrentProcess().MainModule 

儘可能系統。NullReferenceException異常。如果你看看MainModule的文檔中,你會發現,這個屬性可以拋出也NotSupportedException異常,PlatformNotSupportedException和InvalidOperationException異常。

的GetEntryAssembly方法也不是100%的 「安全」。 MSDN:當管理組件 已經從非託管應用程序加載

的GetEntryAssembly方法可以返回null。例如,如果一個 非託管應用程序創建在C#編寫 COM組件的一個實例,以從C#部件 返回null的GetEntryAssembly方法的調用,因爲入口點的過程是非託管 代碼,而不是被管理的組件。

對於我的解決方案,我更喜歡Assembly.GetEntryAssembly().Location

更感興趣的是,如果需要解決的問題爲虛擬化。例如,我們有一個項目,我們使用Xenocode Postbuild將.net代碼鏈接到一個可執行文件中。這個可執行文件必須重命名。所以上述所有方法都不起作用,因爲它們只獲取原始程序集或內部程序的信息。

我發現的唯一解決辦法是

var location = System.Reflection.Assembly.GetEntryAssembly().Location; 
var directory = System.IO.Path.GetDirectoryName(location); 
var file = System.IO.Path.Combine(directory, 
    System.Diagnostics.Process.GetCurrentProcess().ProcessName + ".exe"); 
2

這一個未包括:

System.Windows.Forms.Application.ExecutablePath; 

〜喬

8

Environment.GetCommandLineArgs()[0]

相關問題