2010-03-11 38 views
39

Có hằng số biến hoặc tiền xử lý cho phép biết mã được thực hiện trong ngữ cảnh của Visual Studio không?Cách phát hiện mã C# Windows Forms được thực hiện trong Visual Studio?

+0

Bạn có muốn thông tin này để biết nếu mã của bạn nó đang được gỡ rối? Nếu có, có một macro cho bạn biết nếu trình gỡ lỗi được đính kèm vào ứng dụng của bạn, hãy tham khảo: http://stackoverflow.com/questions/2188201/is-there-a-way-to-detect-if-a-debugger-is -attached-to-a-process-from-c –

+0

Trong C# bạn có thể sử dụng: http://stackoverflow.com/questions/361077/c-clr-remote-debugger-how-to-wait-until-attached –

Trả lời

56

Hãy thử Debugger.IsAttached hoặc DesignMode sở hữu hoặc nhận ProcessName hoặc kết hợp, phù hợp

Debugger.IsAttached // or          
LicenseUsageMode.Designtime // or 
System.Diagnostics.Process.GetCurrentProcess().ProcessName 

Đây là một sample

public static class DesignTimeHelper { 
    public static bool IsInDesignMode { 
     get { 
      bool isInDesignMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime || Debugger.IsAttached == true; 

      if (!isInDesignMode) { 
       using (var process = Process.GetCurrentProcess()) { 
        return process.ProcessName.ToLowerInvariant().Contains("devenv"); 
       } 
      } 

      return isInDesignMode; 
     } 
    } 
} 
+0

+1 cho Debugger.IsAttached –

+6

đừng quên rò rỉ bộ nhớ điên trên Process.GetCurrentProcess() nhớ để vứt bỏ – Neil

+0

Trong mã của tôi, tôi đã thêm một biến bool tĩnh để biết khi nào IsInDesignMode được gọi và một số khác để giữ kết quả của hàm.Khi bắt đầu hàm, tôi trả về kết quả của cuộc gọi đầu tiên. Với điều này, bên trong của hàm chỉ gọi một lần trong thời gian thiết kế và một lần trong thời gian chạy. Tôi không thấy bất kỳ xung đột nào khi thời gian thiết kế được hợp nhất với thời gian chạy và điều này nhanh hơn nhiều khi bạn có một số lượng lớn các cuộc gọi đến hàm này. – Samuel

1

Có một thuộc tính DesignMode mà bạn có thể kiểm tra nhưng theo kinh nghiệm của tôi, nó không phải lúc nào cũng chính xác. Bạn cũng có thể kiểm tra xem liệu tệp thực thi có phải là DevEnv.exe

Chụp look here. Có thể làm cho câu hỏi này là một vấn đề song song nhưng tất cả đều phụ thuộc vào những gì bạn đang cố gắng thực hiện.

6

Có thuộc tính DesignMode cho Thành phần. Nó rất tiện lợi khi bạn sử dụng Design Viewer của VS.

Nhưng khi bạn nói về gỡ lỗi trong Visual Studio, bạn cần sử dụng thuộc tính Debugger.IsAttached. Sau đó, bạn có thể sử dụng

#if DEBUG 
#endif 

quá

+0

+ 1 cho Debugger.IsAttached –

3

Tôi nghĩ rằng cách đơn giản và đáng tin cậy nhất để xác định xem phần mở rộng của bạn được thực hiện trong thiết kế WinForms là để kiểm tra quá trình hiện hành.

public static bool InVisualStudio() { 
    return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName); 
} 
1

tôi sử dụng mã này để phân biệt cho dù đó đang chạy trong Visual Studio hoặc nếu nó được triển khai cho khách hàng.

if (ApplicationDeployment.IsNetworkDeployed) { 
    // do stuff 
} else { 
    // do stuff (within Visual Studio) 
} 

Hoạt động tốt cho tôi ở mọi lứa tuổi. Tôi bỏ qua một số logic khi bên trong Visual Studio (chẳng hạn như đăng nhập vào ứng dụng, vv).

+0

Không phải là giả định [ClickOnce] (http://en.wikipedia.org/wiki/ClickOnce) được sử dụng (ngụy trang trong Visual Studio là "Xuất bản")? Nó sẽ hoạt động nếu một dự án thiết lập được sử dụng để tạo ra một trình cài đặt [MSI] (http://en.wikipedia.org/wiki/Windows_Installer) bình thường? –

15

Thuộc tính DesignMode không phải lúc nào cũng chính xác. Chúng tôi đã sử dụng phương pháp này để phương thức hoạt động nhất quán:

protected new bool DesignMode 
    { 
     get 
     { 
      if (base.DesignMode) 
       return true; 

      return LicenseManager.UsageMode == LicenseUsageMode.Designtime; 
     } 
    } 

Ngữ cảnh của cuộc gọi là quan trọng. Chúng tôi đã có DesignMode trả về false trong IDE nếu chạy trong một sự kiện trong một số trường hợp nhất định.

1

Bạn có thể sử dụng này:

protected static bool IsInDesigner 
{ 
    get { return (Assembly.GetEntryAssembly() == null); } 
} 
2

tôi sử dụng phương pháp mở rộng này:

internal static class ControlExtension 
{ 
    public static bool IsInDesignMode(this Control control) 
    { 
     while (control != null) 
     { 
      if (control.Site != null && control.Site.DesignMode) 
       return true; 
      control = control.Parent; 
     } 
     return false; 
    } 
} 
Các vấn đề liên quan