Манифест для зависимостей от элементов, кроме основного исполняемого файла?

Сначала я объясню, что я пытаюсь сделать (и почему), а затем подробнее расскажу.

Я пытаюсь заставить регистрацию Free COM активации работать в контексте языка, который скомпилирован JIT. Я использую Reg-Fre COM, потому что я хотел бы избежать регистрации моего COM-компонента и хотел бы, чтобы это приложение можно было установить без прав администратора.

JIT-компилятор является основным исполняемым файлом с подписью и содержит встроенный манифест. Последние версии Windows по умолчанию предпочитают встраиваемый манифест внешнему (в Windows XP это было наоборот). Поскольку JIT подписан, я не могу извлечь / изменить / обновить его манифест без нарушения подписи. Кроме того, это усложнит обслуживание нашего приложения (всегда следите за тем, чтобы мы встраивали новый манифест). И есть также юридические последствия изменения программы, права на которые мне не принадлежат.

Итак, моя идея состояла в том, чтобы попытаться получить активацию WinSxS через библиотеку-оболочку Win32, для которой я бы предоставил манифест, в котором перечислены зависимости. В качестве доказательства концепции я решил создать простое приложение VB6, библиотеку C++ Wrapper и две библиотеки COM (1 в.NET и 1 в VB6). Оболочка содержит 3 метода: один вызывает VB6 COM, второй вызывает.NET COM, а другой возвращает простую строку. Пока все как мой COM зарегистрировано, это работает, конечно. Если я отменил их регистрацию, предоставил манифесты для COM и добавил их в качестве зависимостей в манифест основного исполняемого файла, это работает. Если я отменил их регистрацию, предоставил манифесты для COM и C++ Wrapper и добавил com в качестве зависимостей для C++ Wrapper, а затем добавил C++ Wrapper в качестве единственной зависимости в манифесте основного исполняемого файла, это работает. Если я удаляю манифест моего основного исполняемого файла, вызовы COM перестают работать, но простой строковый метод все еще работает.

Обратите внимание, что для всех моих тестов я запускаю сценарий Powershell, который изменяет дату изменения всех моих файлов, обеспечивая отключение кеша контекста активации (манифеста).

Оттуда я начал отладку, используя SXSTrace.exe и установив переменную COMPlus_LoadLogDir. Я обнаружил, что если мой манифест является внешним, он никогда не принимается во внимание. Я также обнаружил, что если я встраиваю его в.DLL, sxstrace показывает, что он найден, проанализирован и что зависимости найдены, их манифест найден, и я получаю обычные успешные строки активации контекста в журнале.

INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\vbCom.MANIFEST.
INFO: Manifest Definition Identity is vbCom,type="win32",version="1.0.0.0".
INFO: Parsing Manifest File C:\RegFreeComWrapper\bin\netCom.MANIFEST.
INFO: Manifest Definition Identity is netCom,processorArchitecture="msil",version="1.0.0.0".
INFO: Activation Context generation succeeded.
End Activation Context Generation.

Тем не менее, даже если в журнале сказано, что мои COM-вызовы по-прежнему не выполняются. Когда происходит вызов для.NET COM-вызова, я получаю некоторые выходные данные в настроенном пути COMPlus_CLRLoadLogDir.

В этом случае я не получаю никакого вывода.

Как только я добавляю манифест, который перечисляет мой C++ Wrapper как зависимость от моего основного исполняемого файла, все начинает работать снова. Я получаю аналогичный вывод от SXSTrace, но теперь вызов COM работает. Как уже упоминалось, во всех случаях работает простой строковый метод C++ Wrapper. Это означает, что даже если у меня нет манифеста из моего основного исполняемого файла, он все равно может найти мой.dll и вызвать его. Похоже, что COM не работают, если у меня нет полной цепочки манифеста: Application.Manifest > Wrapper.Manifest > COMs манифесты

Итак, две вещи здесь... 1. То, что я пытаюсь сделать, даже возможно? (Наличие зависимостей, перечисленных только в манифесте DLL, которая принадлежит мне, не затрагивая манифест основного исполняемого файла) 2. Если это возможно, я, вероятно, пропускаю только небольшую вещь, чтобы все заработало... что это?:)

Я могу предоставить весь мой код / ​​исполняемый файл в качестве примеров, если кому-то будет интересно попробовать что-то с ними.

1 ответ

Решение

Работай!

Я изменил свой C++ Wrapper, чтобы использовать API Activation Context и принудительно активировать контекст, используя ActivateActCtx

http://msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx

Я обернул свой код кодом их примера и удостоверился, что ссылаюсь на мои манифесты, и теперь все работает нормально. Нет манифеста на моем основном исполняемом файле!

Другие вопросы по тегам