Assembly.CodeBase trông đầy hứa hẹn, nhưng đó là một đường dẫn UNC:
Do lưu ý rằng nó là một cái gì đó gần giống một file uri, không một UNC path.
Bạn giải quyết điều này bằng cách thực hiện thao tác chuỗi bằng tay. Nghiêm túc.
Hãy thử tất cả các phương pháp khác mà bạn có thể tìm thấy trên SO với các thư mục sau (nguyên văn):
C:\Test\Space()(h#)(p%20){[a&],[email protected],p%,+}.,\Release
Đây là một, nếu hơi bất thường, Windows đường dẫn hợp lệ. (Một số người sẽ có hoặc là một trong những nhân vật trong đó đường đi, và bạn sẽ muốn bạn phương pháp để làm việc cho tất cả của những người, phải không?)
Các cơ sở mã có sẵn (we do not want Location
, right?) tài sản này sau đó (trên Win7 của tôi với.NET 4):
assembly.CodeBase -> file:///C:/Test/Space()(h#)(p%20){[a&],[email protected],p%,+}.,/Release
assembly.EscapedCodeBase -> file:///C:/Test/Space(%20)(h%23)(p%20)%7B%5Ba%26%5D,[email protected],p%,+%7D.,/Release
Bạn sẽ lưu ý:
CodeBase
không được thoát nào cả, nó chỉ là con đường địa phương thường xuyên bắt đầu bằng file:///
và backslashes thay thế. Như vậy, số không hoạt động để cấp dữ liệu này cho System.Uri
.
EscapedCodeBase
không được thoát hoàn toàn (Tôi làm không biết nếu điều này là một lỗi hoặc nếu đây là một thiếu sót của URI scheme):
- Lưu ý cách nhân vật không gian (
) dịch để %20
- nhưng trình tự
%20
cũng là cũng chuyển thành %20
! (phần trăm %
không được thoát hoàn toàn)
- Không ai có thể tạo lại bản gốc từ biểu mẫu bị xáo trộn này!
Đối với các file cục bộ (Và đó là thực sự tất cả tôi muốn quan tâm cho những thứ CodeBase
, bởi vì nếu các tập tin không phải là địa phương, bạn có thể muốn sử dụng .Location
dù sao, các công trình sau đây cho tôi (lưu ý rằng nó không phải là đẹp nhất hoặc là:
public static string GetAssemblyFullPath(Assembly assembly)
{
string codeBasePseudoUrl = assembly.CodeBase; // "pseudo" because it is not properly escaped
if (codeBasePseudoUrl != null) {
const string filePrefix3 = @"file:///";
if (codeBasePseudoUrl.StartsWith(filePrefix3)) {
string sPath = codeBasePseudoUrl.Substring(filePrefix3.Length);
string bsPath = sPath.Replace('/', '\\');
Console.WriteLine("bsPath: " + bsPath);
string fp = Path.GetFullPath(bsPath);
Console.WriteLine("fp: " + fp);
return fp;
}
}
System.Diagnostics.Debug.Assert(false, "CodeBase evaluation failed! - Using Location as fallback.");
return Path.GetFullPath(assembly.Location);
}
tôi chắc chắn người ta có thể đưa ra giải pháp tốt hơn, có lẽ là một thậm chí có thể đưa ra một giải pháp mà không thích URL en-/giải mã của CodeBase
tài sản nếu đó là một con đường địa phương, nhưng cho rằng một trong những chỉ có thể tách ra khỏi file:///
một d được thực hiện với nó, tôi muốn nói giải pháp này là viết tắt là đủ tốt, nếu chắc chắn thực sự xấu xí.
dupl có thể có icate của [Có phương pháp .NET Framework để chuyển đổi các tệp URI thành các đường dẫn có ký tự ổ đĩa không?] (http://stackoverflow.com/questions/278761/is-there-a-net-framework-method-for-converting- file-uris-to-path-với-drive-le) – nawfal