createObject в VB6 не работает при запуске exe - PullRequest
0 голосов
/ 05 июня 2011

У меня есть программа VB6, которая пытается запустить DLL, написанную на C #.
Эта DLL имеет интерфейс COM, поэтому я могу создать объект класса с помощью «CreateObject». Проблема в том, что он работает и работает хорошо, когда я запускаю его из IDE VB6, но когда я делаю EXE и пытаюсь его запустить, выдается исключение: «Ошибка автоматизации. Системе не удалось найти указанный файл (-2147024894).»

Почему это происходит и как я могу это решить?

Ответы [ 4 ]

0 голосов
/ 23 июня 2011

попробуйте скомпилировать его как установщик и включите dll / com, который вы используете в компиляции пакета установщика, чтобы используемый вами dll / com был включен в сборку вашего exe ..окна не просто копируют мимо этого.

0 голосов
/ 06 июня 2011

Метод, который я использую для определения проблем такого типа, - это открыть диалоговое окно добавления ссылки в Visual Basic 6. Я прокручиваю список доступных библиотек COM и проверяю, есть ли в списке проблемная DLL. Если это так, то CreateObject должен работать, вы должны иметь возможность назначить ему вариантный вариант и использовать позднюю привязку для доступа к его членам.

Кроме того, попробуйте временно установить ссылку на переменную и вместо использования CreateObject используйте = New и посмотрите, какие сообщения об ошибках, если они есть, выдают. В общем, я нашел их более информативными, чем те, которые были созданы CreateObject.

Наконец, было бы полезно, если бы вы опубликовали причину, по которой вы решили использовать CreateObject вместо установки ссылки. Если DLL является известным объектом, который будет постоянно использоваться программой, тогда должна быть установлена ​​ссылка и обычно используется раннее связывание.

Наконец, возможно, ошибка вызвана зависимостью C # COM DLL, а не самой DLL. Если, например, я должен был взять библиотеку Com и правильно зарегистрировать ее, но она полагается на библиотеку COM Widget2000, и она НЕ зарегистрирована, то это вызовет ошибку автоматизации. Особенно, если вы тестируете EXE в установленной среде, а не в той среде, в которой вы его соблюдаете.

Например, предположим, что у меня есть программа CAD, написанная на VB6, и у меня есть дерево исходных текстов, которое начинается с MyCAD. Exe находится в MyCAD / MainEXE, а библиотека форм находится в MyCAD / ShapeLibrary. Я запускаю IDE все в порядке. Затем я настраиваюсь и захожу на свой тестовый компьютер и устанавливаю его, и возникает ошибка при создании shape-библиотеки.

Первым делом я проверю, будет ли MainEXE работать из директории MainEXE моего дерева исходных текстов. Этот тест устранит, является ли это проблемой при установке или причудой версии IDE против совместимой. Тогда я бы посмотрел на настройку и увидел, что не регистрируется. Также посмотрите на источник для библиотеки C # или настройку для библиотеки и посмотрите, какие зависимости ей нужны. Поскольку это COM-библиотека, соответствующая требованиям, вы должны иметь возможность использовать средство обхода зависимостей, чтобы увидеть, какие COM-ссылки ссылаются на нее. Наконец, убедитесь, что установлена ​​правильная версия .NET Framework.

0 голосов
/ 08 июня 2011

Если вы компилируете C # DLL на своем тестовом компьютере - убедитесь, что вы отметили регистр для параметра COM Interop .Если вы не компилируете на одной машине, вам нужно запустить RegAsm с параметром / codebase.

0 голосов
/ 05 июня 2011

Посмотрите на Project, References в IDE и посмотрите, какой dll или ocx файл принадлежит объекту, на который вы ссылаетесь с помощью CreateObject (диспетчер объектов также может помочь выяснить). Этот файл DLL должен быть доступен, когда исполняемый файл тоже скомпилирован. Обычно вам нужно зарегистрировать его с помощью regsvr32.exe.

...