У меня есть проект веб-службы C #. Я создал клиента, который создает и управляет подключением к сервису. У нас есть более старый продукт для ПК, написанный на C ++, и у них должен быть интерфейс для вызова службы. Я создал несколько вызовов для клиента и сделал новые объекты, которые видны COM, для передачи данных. Затем я устанавливаю флажок в настройках проекта, который гласит «Зарегистрироваться для взаимодействия COM». Кажется, все это создается и работает локально (я использую Visual Studio в качестве администратора). Но когда я регистрируюсь на моем TFS-сервере, сборка завершается неудачно: «Не удается зарегистрировать сборку« MyClient.dll »- доступ запрещен. Пожалуйста, убедитесь, что вы запускаете приложение от имени администратора. Доступ к разделу реестра «HKEY_CLASSES_ROOT \ MyClient.MyClass» запрещен.
Есть ли способ повысить мой токен на сборочной машине или каким-либо другим способом решить эту проблему?
Вам необходимо передать приведенное ниже значение в MSBuild, используя параметр Arguments MSBuild в параметре процесса определения вашей сборки.
/ Р: RegisterForComInterop = ложь
Я нашел способ, чтобы это сработало! Если вы посмотрите на XML в вашем проекте, вы увидите узел, который выглядит следующим образом:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<PlatformTarget>x86</PlatformTarget>
<UseVSHostingProcess>false</UseVSHostingProcess>
<RegisterForComInterop>true</RegisterForComInterop>
</PropertyGroup>
Проблема здесь, конечно, в строке, которая указывает проекту зарегистрироваться для взаимодействия. Я также вижу аналогичное определение для конфигурации выпуска. Я могу решить проблему, убрав строку или сняв флажок через пользовательский интерфейс, но у меня есть другие люди в проекте, которым нужно получить код, и было бы лучше, если бы версия проекта в системе контроля версий просто работала для них , ответ состоит в том, чтобы снять флажок регистрации взаимодействия в определении выпуска, но оставить его в определении отладки, а затем изменить определение сборки TFS так, чтобы оно собиралось только для выпуска. Таким образом, мои коллеги могут иметь объект com, и сервер сборки не будет жаловаться.
Ваш агент компоновки TFS, вероятно, работает под учетной записью службы, поэтому эта учетная запись требует повышенных привилегий. Вам необходимо добавить учетную запись службы в группу администраторов на ваших серверах сборки.
Однако ваш администратор TFS может не захотеть этого делать. Даже если предоставление учетной записи дополнительных привилегий не является проблемой, у них может быть проблема с тем, что ваша сборка делает «вещи» в реестре.
Вы может вызывать COM-компоненты из C ++ без необходимости их регистрации
Эта статья на регистрации Free COM более подробно