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?
Trả lời
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;
}
}
}
+1 cho Debugger.IsAttached –
đừng quên rò rỉ bộ nhớ điên trên Process.GetCurrentProcess() nhớ để vứt bỏ – Neil
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
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.
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á
+ 1 cho Debugger.IsAttached –
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);
}
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).
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? –
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.
Bạn có thể sử dụng này:
protected static bool IsInDesigner
{
get { return (Assembly.GetEntryAssembly() == null); }
}
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;
}
}
- 1. Nhập Windows Forms (C#), Visual Studio 2012
- 2. Thực hiện Visual Studio Intellisense
- 3. "LoaderLock đã được phát hiện" với Visual Studio 2012
- 4. Visual Studio tìm đường dẫn mã/đường dẫn thực hiện
- 5. Phát hiện phiên bản Visual Studio bên trong VSPackage
- 6. Phát hiện phím Shift được nhấn mà không sử dụng các sự kiện trong Windows Forms?
- 7. C# Mã không thể truy cập được phát hiện
- 8. Trộn Mã C# và mã C++ được nhân lên trên Windows với Visual Studio
- 9. Phát hiện kênh phân phối/loại giấy phép Visual Studio
- 10. Cách thoát Ứng dụng Windows Forms trong C#
- 11. Visual Studio 2012 không phát hiện công cụ xây dựng Visual Studio 2008
- 12. Phát hiện Antivirus trên Windows bằng C#
- 13. Phát hiện Windows hoặc Linux trong C, C++
- 14. Phát triển mã MATLAB trong Visual Studio
- 15. Windows Forms DataGridView có thực hiện chế độ ảo thực sự không?
- 16. Visual Studio - Windows đã được ghim?
- 17. phát hiện chấm dứt chương trình (C, Windows)
- 18. Android Studio - "Android framework được phát hiện trong dự án"
- 19. Phát hiện mã chết trong dự án C/C++ cũ
- 20. Phát hiện mã hóa
- 21. Làm cách nào để phát hiện điểm ngắt đang bị xóa trong Visual Studio?
- 22. Common Language Runtime phát hiện một chương trình không hợp lệ trong Visual Studio
- 23. Cách phát hiện Windows bị khóa?
- 24. Sử dụng C# Cách phát hiện nếu Windows Installer 4.5 được cài đặt
- 25. tham nhũng heap được phát hiện | C++
- 26. Visual Studio 2012: Cách thực hiện sự kiện post-build có điều kiện
- 27. .NET - ContextSwitchDeadlock đã được phát hiện
- 28. Cách thực hiện lược tả hiệu suất trong Visual Studio 2008 "Pro"
- 29. WPF hoặc Windows Forms
- 30. Thực hiện mã khi breakpoint được nhấn?
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 –
Trong C# bạn có thể sử dụng: http://stackoverflow.com/questions/361077/c-clr-remote-debugger-how-to-wait-until-attached –