У меня есть сборка Win32 (оболочка C ++ / CLI поверх моего кода .NET), которая должна быть установлена в WinSxS и на которую должны ссылаться клиентские приложения с помощью API. Я немного изучил, как установить сборку Win32 в WinSxS, и, наконец, смог сделать это с помощью файлов mainfest и catalog.
Теперь проблема в том, что я не могу использовать сборку из консольного приложения, которое я создал для тестирования. Я добавил <dependency>
раздел exe манифеста для ссылки на сборку (показанную ниже), но она не работает.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity name="MyAssembly" processorArchitecture="x86" publicKeyToken="10f783dc6145a3s0" type="win32" version="1.0.0.58">
</assemblyIdentity>
</dependentAssembly>
</dependency>
</assembly>
Exe не удается с сообщением об ошибке: Программа не может запуститься, потому что MyAssembly.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы решить эту проблему.
При проверке с помощью Procmon выясняется, что исполняемый файл ищет только dll в расположении исполняемого файла и во всех местоположениях, указанных в переменной среды Path. Когда я поместил WinSxS расположение DLL в переменную Path и запустил приложение, оно работало правильно. Интересно, есть ли какие-либо другие настройки проекта, которые я пропускаю при создании exe-манифеста, вызывающего проблему. Идеи?
Проблема оказалась в настройке проекта UAC. Если для свойства UAC установлено значение Нет, проблема решена, и приложение теперь может загружать сборку без необходимости использовать обходные пути, такие как добавление к переменной PATH.