簡體   English   中英

檢測程序是否由Visual Studio運行,而不是從Windows資源管理器運行

[英]Detecting if a program was run by Visual Studio, as opposed to run from Windows Explorer

有沒有辦法檢測您的程序是否通過Visual Studio加載,而不是它是作為獨立的可執行文件啟動的?

我們的軟件具有錯誤報告功能,可以處理未處理的異常 - 我們需要能夠將調試版本分發給我們的beta測試人員,但是當我們處於開發階段時,我們不希望錯誤報告發生,因為如果VS使用完整堆棧跟蹤捕獲它們,則異常會更有用。

現在,如果Application.ExecutablePath包含bin \\ Debug或bin \\ Release,我將禁用錯誤報告,但我認為可能有更強大的方法來檢測程序是否通過VS加載。

顯然,我們可以使用一些預處理器宏來設置不同的構建,但是為了這個問題,假設這不是一種可能性 - 我不介意添加代碼,但我試圖對其進行最少的修改構建過程,這就是為什么命令行選項也是最后的選擇。

如果重要,我正在使用VS2003 / .NET 1.1。

如果你這樣做是為了確定它是否在任何調試器中(由@JaredPar澄清),你可以在異常處理程序中使用Debugger.IsAttached

try
{
    // ...
}
catch(Exception ex)
{
    if (!Debugger.IsAttached)
    {
        ExceptionHandler.Frob(ex);
    }
    else
    {
        throw;
    }
}

或者:

public static void Frob(Exception ex)
{
    if (Debugger.IsAttached)
    {
        Debugger.Break();
    }
}

你考慮過命令行參數嗎? 使用--no-exception-handling標志(或任何合適的聲音)從Visual Studio運行程序,如果傳入該參數,則不處理異常。當你在其他地方啟動程序時,如果沒有這個參數,它將會表現正常。

我不做.net開發,但在java中我通過將標志傳遞給應用程序的啟動選項來完成此操作。 因此,您可以從IDE將調試標志傳遞到應用程序,然后檢查,當應用程序作為可執行文件運行時,標志將不存在。 如果.net沒有類似的東西,我會感到驚訝。

我知道這已經過時了,但所提供的解決方案並不令人滿意。

我改為使用以下類:

using System.IO;
using System.Reflection;

public static class Program
{
    public static string ExecutablePath
    {
        get;
        private set;
    }

    static Program()
    {
        var assemblyPath = Assembly.GetEntryAssembly().Location;
        var assemblyDirectory = Path.GetDirectoryName(assemblyPath);

        if (assemblyDirectory.EndsWith(@"\Debug") || assemblyDirectory.EndsWith(@"\Release"))
        {
            string projectFile = Path.GetFileNameWithoutExtension(assemblyPath) + ".csproj";

            var root = new DirectoryInfo(assemblyDirectory);

            while (root.Parent != null)
            {
                if (File.Exists(Path.Combine(root.FullName, projectFile)))
                    break;

                root = root.Parent;

                if (root.Parent == null) // we could not find it (should not happen)
                    ExecutablePath = assemblyDirectory;
            }

            ExecutablePath = root.FullName;
        }
        else
        {
            ExecutablePath = assemblyDirectory;
        }
    }
}

然后你可以使用Program.ExecutablePath 如果您已經有一個名為Program的類,您可以通過這些屬性和方法擴展它。

如果從Visual Studio運行,它將為您提供csproj文件所在的項目路徑。 這是沒有“bin \\ * \\ Debug”或“bin \\ * \\ Release”內容的可執行路徑。

如果沒有從Visual Studio運行,它將為您提供可執行文件所在的路徑。

該解決方案獨立於調試設置,其他附加調試器或構建配置。 唯一重要的是,您的配置名為“Release”和“Debug”。

注意:正如Troy Gizzi在評論中提到的,此解決方案僅在從輸出目錄以外的其他目錄運行可執行文件時才有效。 對於我的用例(模擬部署目錄結構,項目目錄為根目錄),這是一個合適的解決方案。 一般情況下,我稍后將我的可執行文件復制到部署目錄,並期望與從Visual Studio中運行我的程序一樣的行為。 在我的案例中,內容和其他依賴項相對於項目目錄而定。

我會添加一個啟用報告功能的配置標志,而不是按進程樹進行跟蹤。 除非您在DEV環境中,否則該標志始終默認為“true”,然后將其設置為“false”。

有時,應用程序在調試器外部啟動,調試器稍后會附加。 (雙擊應用程序分配給的文件...)我使用此代碼等待調試器附加。

using System.Diagnostics;

Process[] procName = Process.GetProcessesByName("devenv");

if(procName.Length > 0)
  MessageBox.Show("Wait for debugger attach");

暫無
暫無

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

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