C#: поиск пути к PresentationCore.dll (и другим сборкам) в GAC

Мне нужно сослаться на различные сборки в CSharpCodeProvider через вызов ReferencedAssemblies.Add.

Для некоторых сборок достаточно просто передать имя сборки, например ReferencedAssemblies.Add("System.dll").

Однако PresentationCore.dll является одним из тех, где требуется полный путь к сборке, который я могу не знать на целевой машине.

Вопрос:

Как я могу найти окончательный путь к (последней?) соответствующей сборке, скажем, в GAC?

В идеале решение должно работать не только для PresentationCore.dll, но и для других сборок, таких как PresentationFramework.dll, System.Xaml.dll или System.Windows.Forms.

Источники, которые не дали ожидаемых результатов:

  • Это решение предполагает жесткое кодирование определенного пути, но решение должно быть динамическим
  • Реализация этого Windows API может работать; но я не знаю как - и поможет ли это вообще решить вышеуказанное
  • Этот вопрос C++ относится к тому, где находится GAC, но не как получить фактический путь к файлу

person JDR    schedule 15.09.2018    source источник
comment
Можно ли ссылаться на эти сборки в программе, которая должна выполнять разрешение? Затем вы можете просто typeof([TypeKnownToBeInTheDesiredAssembly]).Assembly.CodeBase обработать результат, используя: stackoverflow.com/a/283917/4035472.   -  person thehennyy    schedule 15.09.2018
comment
@thehennyy Это сработало безупречно - большое спасибо. Если бы вы могли превратить это в ответ, я смогу отметить его как принятый.   -  person JDR    schedule 15.09.2018


Ответы (1)


Вы можете ссылаться на сборки в коде, который должен выполнять разрешение. Затем среда выполнения сообщит вам место сборки:

typeof([TypeKnownToBeInTheDesiredAssembly]).Assembly.CodeBase

например, чтобы найти System.Xml.dll:

string codeBase = typeof(System.Xml.XmlDocument).Assembly.CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
Console.WriteLine(path);

[ссылка]

В моей системе:

C:/Windows/Microsoft.Net/сборка/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

person thehennyy    schedule 15.09.2018
comment
Разве Assembly.Location не лучше, чем Assembly.CodeBase? - person svick; 15.09.2018
comment
Assembly.Location это хороший момент, но в прошлом я с этим сталкивался. Возможно, принять во внимание оба свойства - person thehennyy; 15.09.2018