Assembly.CodeBase: когда нет файла-URI? - PullRequest
2 голосов
/ 23 октября 2009

Assembly.Location дает простой путь к сборке. К сожалению, при запуске в теневой среде, такой как модульное тестирование или ASP.NET, этот параметр пуст. Однако свойство Codebase доступно и предоставляет URI, который можно использовать вместо него. В каких случаях он не возвращает URI, начинающийся с file:///? Или, другими словами: в каких случаях это не сработает или даст непригодные результаты?

Assembly assembly = GetType().Assembly;    
Uri codeBaseUri = new Uri(assembly.CodeBase);
string path = codeBaseUri.LocalPath;

Ответы [ 2 ]

3 голосов
/ 23 октября 2009

Можно загружать сборки напрямую через HTTP, например, при развертывании ClickOnce:

Assembly assembly = Assembly.LoadFrom("http://server/app.dll");
Uri codeBaseUri = new Uri(assembly.CodeBase);
Debug.Assert(codeBaseUri.Scheme == "http"); 
Debug.Assert(codeBaseUri.LocalPath == "");
Debug.Assert(assembly.Location == "");
0 голосов
/ 07 мая 2010

Кроме того, # char рассматривается как разделитель фрагментов. См. http://blogs.msdn.com/ncl/archive/2010/02/23/system-uri-f-a-q.aspx (раздел 9) для краткого объяснения.

Используйте Assembly.EscapedCodeBase вместо Assembly.CodeBase для борьбы с ним.

...