Ngoài các câu trả lời ở trên.
tôi đã viết test.exe sau đây là giao diện điều khiển ứng dụng
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);
}
Sau đó, tôi biên soạn dự án và đổi tên sản lượng của nó vào file test2.exe. Các dòng đầu ra là chính xác và giống nhau.
Nhưng, nếu tôi bắt đầu nó trong Visual Studio, kết quả là:
d: \ test2.vhost.exe
d: \ test2.exe
d: \ test2.exe
C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ mscorlib.dll
Trình cắm thêm ReSharper vào Visual Studio đã gạch chân
System.Diagnostics.Process.GetCurrentProcess().MainModule
làm hệ thống có thể.Ngoại lệ tham khảo. Nếu bạn nhìn vào tài liệu của MainModule, bạn sẽ thấy rằng thuộc tính này có thể ném cả NotSupportedException, PlatformNotSupportedException và InvalidOperationException.
Phương pháp GetEntryAssembly cũng không an toàn 100%. MSDN:
Phương pháp GetEntryAssembly có thể trở lại null khi một hội đồng quản lý đã được tải từ một ứng dụng không được quản lý. Ví dụ: nếu ứng dụng không được quản lý tạo một phiên bản của thành phần COM được viết bằng trong C#, lệnh gọi phương thức GetEntryAssembly từ thành phần C# trả về null, vì điểm nhập cho quá trình không được quản lý mã chứ không phải là hội đồng được quản lý .
Đối với các giải pháp của tôi, tôi thích Assembly.GetEntryAssembly().Location
.
Sở thích khác là cần giải quyết vấn đề cho việc ảo hóa . Ví dụ, chúng ta có một dự án, trong đó chúng ta sử dụng một Postococode Postbuild để liên kết mã .net thành một tệp thực thi. Tệp thi hành này phải được đổi tên. Vì vậy, tất cả các phương pháp trên không hoạt động, bởi vì chúng chỉ nhận được thông tin cho quá trình lắp ráp ban đầu hoặc bên trong.
Giải pháp duy nhất tôi thấy là
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");
Điều này có xu hướng thêm ".vhost". trong tên tệp, một vấn đề không xuất hiện nếu sử dụng System.Reflection.Assembly.GetEntryAssembly() .Địa điểm (xem câu trả lời thay thế). – Contango
@Contango, đó là do sử dụng "Visual Studio Hosting Process" trong VS. – LuddyPants
Để thử nghiệm đơn vị trong VS 2012. ProcessName: vstest.executionengine.x86 ConfigurationFile: C: \ TFS \ Tests \ MyData.Tests.v4.0 \ bin \ Debug \ MyData.Tests.v4.0.dll.config MainModule.FileName: C: \ FILOGRAM (X86) \ MICROSOFT VISUAL STUDIO 11.0 \ COMMON7 \ IDE \ COMMONEXTENSIONS \ MICROSOFT \ TESTWINDOW \ vstest.executionengine.x86.exe MainModule.ModuleName: vstest.executionengine.x86.exe FriendlyName : UnitTestAdapter: Chạy thử nghiệm – Kiquenet