Регистрация Com+ Interop с Inno Setup

Я использую Inno Setup для создания своей установки. Все работает нормально, но я столкнулся с проблемой: как зарегистрировать .NET DLL, чтобы сделать ее доступной через COM+. Как мы все знаем, .NET предоставляет для этого RegSvcs.exe, поэтому я проверил документацию Inno Setup и нашел только gacinstall, который предназначен для регистрации сборки, но не используется для взаимодействия COM+. Поэтому я добавил это в раздел [Run]

; register .Net components for com+
Filename: {win}\Microsoft.NET\Framework\v4.0.30319\RegSvcs.exe; Parameters: "{app}\bin\Common.dll"; Description: Component registration; WorkingDir: {app}\bin; StatusMsg: Component registration...; Flags: waituntilterminated

Но при тестировании установки эта строка просто пропускается. DLL копируется в цель ранее в разделе [Files] и доступна. После установки я могу без проблем вручную запустить RegSvcs.exe из командной строки.


person YvesR    schedule 14.08.2012    source источник
comment
Просто подсказка (не решение вашей проблемы): вы можете использовать константу {dotnet40} в пути к файлу, чтобы получить путь к .NET 4.0 в зависимости от того, в каком режиме работает установка (32-разрядная или 64-разрядная), или использовать {dotnet4032} для получения 32-разрядный путь .NET 4.0 или {dotnet4064} для 64-разрядного. Он удаляет жесткое кодирование вашего пути.   -  person TLama    schedule 14.08.2012
comment
Но то, что вы описываете, странно, с первого взгляда я не вижу ничего плохого (возможно, я бы удалил WorkingDir, но я думаю, это не должно быть проблемой). В любом случае, какую версию Windows вы используете, Vista up? Если да, то запускаете ли вы свою установку с повышенными правами администратора?   -  person TLama    schedule 14.08.2012
comment
Целевой платформой обычно являются системы Win 2008 R2. Программа установки всегда выполняется с правами администратора.   -  person YvesR    schedule 14.08.2012
comment
Я спрашивал, потому что подозреваю, что ваша библиотека была зарегистрирована, но в другом узле реестра - не под пользователем root. Может быть, вы можете попробовать добавить флаг runasoriginaluser в свою запись запуска, но это все еще только предположение...   -  person TLama    schedule 14.08.2012
comment
Я сталкиваюсь с этой проблемой, когда мое целевое приложение всплывает с ошибкой, в которой говорится, что оно не может создать объект моей dll. Так я узнал, что он вообще не был зарегистрирован. Та же система, тот же пользователь регистрирует компонент из командной строки. Я внесу некоторые изменения, которые вы предложили, и попробую еще раз, следите за обновлениями :)   -  person YvesR    schedule 14.08.2012
comment
Обратите внимание, что по умолчанию Inno предполагает, что приложения являются 32-разрядными. Однако приложения .NET по умолчанию используют двойную 32/64-разрядную версию (если вы не измените их платформу на x86, что требуется, если они связаны с собственным кодом). Если у вас есть чистый код .NET и вы хотите, чтобы он был доступен для всех приложений, вы должны дважды зарегистрировать его в 64-разрядной версии Windows; один раз как 32-битный и один раз как 64-битный.   -  person Miral    schedule 15.08.2012
comment
Хорошо, наконец, после более глубоких исследований выяснилось, что inno setup работает отлично. Дело в том, что regsvcs.exe зарегистрировал компонент под безопасным интерактивным пользователем, но для этого нужна локальная система. @TLama: Добавьте свой комментарий в качестве ответа, чтобы я мог проголосовать за него. Вы помогли мне запустить решение...   -  person YvesR    schedule 27.08.2012
comment
Итак, вы наконец использовали флаг runasoriginaluser? По умолчанию используется флаг runascurrentuser, который наследует учетные данные от мастера (когда флаг postinstall не используется), поэтому это единственное возможное решение, которое я могу придумать. Если нет, не стесняйтесь опубликовать и принять свой собственный ответ (и я проголосую за него :-)   -  person TLama    schedule 27.08.2012
comment
@TLama Я написал это неправильно. Прости. Я ничего не менял в настройках. Компонент регистрируется корректно. Моя проблема заключалась в том, что запись COM+ имеет неправильные учетные данные. Мне нужно написать код, который использует COMAdmin.COMAdminCatalog для изменения настроек безопасности после регистрации. По умолчанию есть интерактивный пользователь, и мне нужна СИСТЕМА.   -  person YvesR    schedule 27.08.2012


Ответы (1)


Inno Setup работает так, как задумано!

Проблема в моем случае: RegSvcs.exe устанавливает компонент с неправильными учетными данными. Он устанавливает COM+ с безопасностью interactive user, но поскольку я вызываю его из службы, пользователя нет, поэтому мне нужны SYSTEM в качестве учетных данных.

Решение. Напишите небольшой фрагмент кода, который изменяет учетные данные безопасности после регистрации. Я не нашел каких-либо опций, чтобы сообщить об этом regsvcs.exe напрямую. Нашел сообщение здесь http://www.carlosag.net/articles/configure-com-plus как это сделать, и теперь будем адаптировать идеи оттуда, чтобы написать небольшую программу для выполнения этой работы.

person YvesR    schedule 27.08.2012
comment
+1, возможно, вы могли бы упомянуть, чтобы проверить правильные записи реестра, чтобы убедиться, что регистрация RegSvcs.exe прошла успешно. - person TLama; 27.08.2012
comment
Что ж, модификация COM+ должна будет инициализироваться с поиском правильного приложения по CLSID. Поэтому, если это не удается, компонент ранее не был правильно зарегистрирован. Но вы подали мне идею. Мой кусок кода можно потом попробовать прописать (я уже знаю пути файлов, где искать) и переделать заново... - person YvesR; 27.08.2012
comment
А, теперь я полностью понял это. Регистрация не удалась из-за настроек безопасности вашего приложения. Хорошо знать! - person TLama; 27.08.2012