Хотите использовать файл COM DLL на развернутых машинах без регистрации файлов DLL - PullRequest
4 голосов
/ 09 октября 2011

Я сделаю это очень просто, поскольку это может очень запутать очень быстро. У меня есть COM DLL (сделано в VB6), который я хотел бы использовать через мое приложение C #. Ниже приведены шаги, которые я предпринял, и результаты.

  1. Создано COM DLL через Visual Basic 6
  2. Добавлена ​​COM dll в приложение .Net.
  3. Получить файл "interop.dllName.dll", созданный .Net в x86 / Debug
  4. Добавлен файл interop как ссылка на сборку в мой исполняемый файл CodeDom.
  5. Файл CodeDom, сгенерированный .exe, прекрасно работал на моем компьютере, когда файл .exe находился в том же каталоге, что и файл interop.dllname.dll
  6. Созданный CodeDom файл .exe не работал , а не на развернутой машине, хотя файл interop.dllname.dll существовал в том же каталоге, что и файл .exe.

Обратите внимание:

  • Исходный файл COM .dll не зарегистрирован на развернутом компьютере, поскольку развернутый компьютер не распознает файл COM .dll как действительный файл DLL.

  • COM .dll был создан в среде x86, а развернутая машина работает в среде x64 (это имеет какое-то значение)?

Какова моя цель: Я хотел бы иметь возможность запуска сгенерированного CodeDom .exe-файла без зависимости от файла interop.dllname.dll. Есть ли способ сохранить эти файлы DLL в памяти? Кроме того, я не хочу, чтобы мой пользователь регистрировал DLL-файлы, прежде чем они смогут использовать созданный CodeDom .exe-файл. Есть ли способ сделать это?

Я ценю любую помощь по этому вопросу.

Спасибо за ваше время,

Evan

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Звучит очень похоже на прямое несоответствие 32/64 бит.Поскольку ваша COM-библиотека 32-разрядная, вам необходимо:

  1. Убедитесь, что приложения, использующие эту COM-библиотеку DLL, предназначены для x86.
  2. Зарегистрируйте COM-библиотеку для 32-разрядной версии regsvr32которая находится в папке SysWow64 на 64-битной машине.

Я предполагаю, что вы пытаетесь зарегистрироваться в 64-битной версии regsvr32.Если вы убедитесь, что все, что связано с регистрацией и потреблением, является 32-разрядным, то все будет в порядке.

2 голосов
/ 09 октября 2011
  1. 64-битный процесс не может загрузить 32-битные библиотеки. Один из способов смягчить это - убедиться, что приложение .NET скомпилировано только для 32-битной версии (в Visual Studio это называется x86)
  2. Чтобы удалить зависимость от взаимодействия dll, оцените опцию «Вставить типы взаимодействия» в VS2010. Я не проверял это сам, но я верю, что он добавлен для сценариев, подобных вашему.
  3. Для регистрации бесплатно COM я думаю, что статья может помочь в качестве отправной точки для вас: http://msdn.microsoft.com/en-us/magazine/cc188708.aspx#S1
1 голос
/ 09 октября 2011

Первая проблема, библиотека interop.name.dll, может быть легко решена декомпиляцией.Просто декомпилируйте библиотеку и включите исходный код в исходную библиотеку.Вы можете использовать любой инструмент декомпиляции, IlSpy должен сделать это.

Что касается COM, существует метод, называемый «Регистрация без COM», он был представлен в Windows XP, подробнее об этом здесь http://msdn.microsoft.com/pl-pl/magazine/cc188708(en-us).aspx.Хотя это, безусловно, работает, я не уверен, возникнут ли у вас какие-либо проблемы из-за несоответствия x86-x64.

...