Làm thế nào để lấy vị trí của DLL hiện đang thực thi?


93

Tôi có một tệp cấu hình mà tôi cần tải như một phần của quá trình thực thi dll mà tôi đang viết.

Vấn đề tôi đang gặp phải là nơi tôi đặt tệp dll và cấu hình không phải là "vị trí hiện tại" khi ứng dụng đang chạy.

Ví dụ: tôi đặt tệp dll và xml ở đây:

D: \ Program Files \ Microsoft Team Foundation Server 2010 \ Application Tier \ Web Services \ bin \ Plugins

Nhưng nếu tôi cố gắng tham chiếu tệp xml (trong dll của tôi) như thế này:

XDocument doc = XDocument.Load(@".\AggregatorItems.xml")

sau đó . \ AggregatorItems.xml dịch thành:

C: \ windows \ system32 \ inetsrv \ AggregatorItems.xml

Vì vậy, tôi cần phải tìm cách (tôi hy vọng) biết được dll hiện đang thực thi nằm ở đâu. Về cơ bản tôi đang tìm kiếm điều này:

XDocument doc = XDocument.Load(CoolDLLClass.CurrentDirectory+@"\AggregatorItems.xml")

Câu trả lời:


137

Bạn đang tìm kiếm System.Reflection.Assembly.GetExecutingAssembly()

string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string xmlFileName = Path.Combine(assemblyFolder,"AggregatorItems.xml");

Ghi chú:

Các .Locationtài sản trả về vị trí của các tập tin DLL đang chạy.

Trong một số điều kiện, DLL được sao chép bóng trước khi thực thi và thuộc .Locationtính sẽ trả về đường dẫn của bản sao. Nếu bạn muốn đường dẫn của DLL gốc, hãy sử dụng thuộc Assembly.GetExecutingAssembly().CodeBasetính để thay thế.

.CodeBasechứa một tiền tố ( file:\), bạn có thể cần phải loại bỏ.


8
Chao ôi! Điều đó trở lạiC:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\tfs\\de3c0c8e\\c1bdf790\\assembly\\dl3\\20b156cb\\22331f24_bfb9cb01\\AggregatorItems.xml
Vaccano

23
Ah! Nhưng Assembly.GetExecutingAssembly().CodeBasecó nó!
Vaccano

2
Codebase đã cho tôi file: \\ c: \ myassemblypath, đó là kỳ lạ
Matt

10
@Matt sử dụng Uri mới (Assembly.GetExecutingAssembly (). CodeBase) .LocalPath để lấy tên thật
Larry

2
string curAssemblyFolder = new System.Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath;
Martin Connell

36

Sự phản chiếu là bạn của bạn, như đã được chỉ ra. Nhưng bạn cần sử dụng đúng phương pháp;

Assembly.GetEntryAssembly()     //gives you the entrypoint assembly for the process.
Assembly.GetCallingAssembly()   // gives you the assembly from which the current method was called.
Assembly.GetExecutingAssembly() // gives you the assembly in which the currently executing code is defined
Assembly.GetAssembly( Type t )  // gives you the assembly in which the specified type is defined.

16

Trong trường hợp của tôi (xử lý các hội đồng của tôi được tải [dưới dạng tệp] vào Outlook):

typeof(OneOfMyTypes).Assembly.CodeBase

Lưu ý việc sử dụng CodeBase(không Location) trên Assembly. Những người khác đã chỉ ra các phương pháp thay thế để xác định vị trí lắp ráp.


5
System.Reflection.Assembly.GetExecutingAssembly().Location

1

Nếu bạn đang làm việc với một ứng dụng asp.net và bạn muốn định vị các hội đồng khi sử dụng trình gỡ lỗi, chúng thường được đưa vào một số thư mục tạm thời. Tôi đã viết phương pháp này để giúp giải quyết tình huống đó.

private string[] GetAssembly(string[] assemblyNames)
{
    string [] locations = new string[assemblyNames.Length];


    for (int loop = 0; loop <= assemblyNames.Length - 1; loop++)       
    {
         locations[loop] = AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.IsDynamic && a.ManifestModule.Name == assemblyNames[loop]).Select(a => a.Location).FirstOrDefault();
    }
    return locations;
}

Để biết thêm chi tiết, hãy xem bài đăng trên blog này http://nodogmablog.bryanhogan.net/2015/05/finding-the-location-of-a-running-assembly-in-net/

Nếu bạn không thể thay đổi mã nguồn hoặc triển khai lại, nhưng bạn có thể kiểm tra các quy trình đang chạy trên máy tính, hãy sử dụng Process Explorer. Tôi đã viết một mô tả chi tiết ở đây .

Nó sẽ liệt kê tất cả các dll đang thực thi trên hệ thống, bạn có thể cần xác định id tiến trình của ứng dụng đang chạy của mình, nhưng điều đó thường không quá khó.

Tôi đã viết một mô tả đầy đủ về cách thực hiện điều này cho một dll bên trong IIS - http://nodogmablog.bryanhogan.net/2016/09/locating-and-checking-an-executing-dll-on-a-running-web -người phục vụ/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.