2014-01-24 1 views
1

Я пытаюсь получить бесплатный доступ к COM-интерфейсу между 64-битной COM-dll и приложением C# для работы.Регистрация без прерывания между 64-битной COM-dll и C# /. Net-приложением

In the answers to a previous question of mine, я получил помощь, которая позволила мне успешно вызвать метод HelloWorld на 64-битной COM-dll для C#.

Однако это было возможно только путем регистрации COM-dll глобально с помощью regsrv32.exe.

Based on this answer связанный с этим вопрос, я думаю, что мне нужно установить флажок Изолировать ссылку dll COM на true. Однако, это приводит к следующей ошибке сборки:

Problem isolating COM reference 'ComLibInteropLib': 
    No registered classes were detected for this component. 

The answer to a question on MSDN social, кажется, указывает, что существует решение этой проблемы, если можно собрать 32-битную версию DLL с.

Однако, моя библиотека взаимодействия COM должна ссылаться на «нормальную» C++ dll, для которой у меня нет источника, и доступен только в качестве x64.

Итак, мой вопрос: как я могу включить изолированный флаг (или иным образом работать бок о бок) между 64-битной COM-dll и приложением C#?

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

ответ

1

Это побочный эффект исходной проблемы, с которой вы столкнулись, сервер COM не регистрировался должным образом. Когда вы используете Isolated вариант true, система сборки автоматически создает необходимые записи манифеста для вас. Но содержание манифеста должно исходить от где-то, оно использует ключи реестра. Поскольку их нет, он не может генерировать манифест.

Вы можете написать манифест самостоятельно, но это требует достаточного понимания того, как должен выглядеть манифест. С очень высокими шансами совершить ошибки заклинания довольно неясны. Поэтому избегайте этого, вам просто нужно получить зарегистрированный COM-сервер для продвижения вперед. Как раз на вашей машине сборки, ее не нужно регистрировать на машине клиента, так как она будет использовать манифест.

Вы упомянули 64-битный COM-сервер, это еще один возможный режим отказа. Система сборки все еще 32-битная, поэтому у вас будут большие шансы, что она будет выглядеть неправильно. HKLM \ Software \ Wow6432Node вместо HKLM \ Software. Сражайтесь с этой проблемой, создавая оба варианта COM-сервера. Опасайтесь иметь такую ​​же проблему, когда вы сами используете Regsvr32.exe, есть два из них. Один в c: \ windows \ syswow64 должен использоваться для регистрации 32-разрядной версии сервера, такой как c: \ windows \ system32 для 64-разрядной версии.

+0

Да, я уверен, что проблема в том, что вы упомянули в своем третьем абзаце. Я не могу построить обе версии, поскольку цель заключается в том, что моя COM-библиотека будет использовать другую (plain C++) dll, которая у меня есть только как 64-битная двоичная. – Wilbert

+1

Вам нужно только зарегистрировать его, он не должен быть запущен. Если вы хотите узнать, что должен выглядеть манифест, тогда просто практикуйте с помощью простого COM-сервера. Вы увидите необходимые записи манифеста, вам просто нужно обновить имена и GUID. Примечательно, что сбор COM для взаимодействия с внутренним кодом становится убыточным предложением, если вам приходится иметь дело с такими драконовскими ограничениями на установку. Использование обертки C++/CLI - лучший способ. –

+0

У нас есть рабочая оболочка C++/Cli, но она выходит из строя из-за локальной статистики, см. [Эта ошибка подключения с WONTFIX] (https://connect.microsoft.com/VisualStudio/feedback/details/336844/static-variable-in -native-метод-причины-исключения-c0020001-во-процесс-выход).Мы надеемся, что использование COM позволит избежать этой проблемы. У нас также были различные другие проблемы с C++/Cli, см. Свой комментарий [здесь] (http://stackoverflow.com/a/19513833/1591992) :) – Wilbert

 Смежные вопросы

  • Нет связанных вопросов^_^