Приложение VB6, использующее COM Interop, прекрасно работает в IDE, но скомпилированный EXE вылетает - PullRequest
4 голосов
/ 07 января 2011

В настоящее время я работаю над приложением в VB6, которое использует библиотеки COM Interop, написанные на C # с использованием платформы .NET 2.0.

Я использовал regasm.exe для регистрации файлов tlb из библиотек .NET с помощью ключа / codebase. Затем я смог успешно собрать и запустить приложение в VB6 IDE без проблем. Код .NET использует файл конфигурации, поэтому я добавил его в каталог VB6, и он отлично считывает данные из конфигурации.

Однако затем я скомпилировал файл EXE из проекта и запустил его на той же машине, на которой работает IDE. Я связал EXE с файлом конфигурации точно так же, как и при отладке с помощью VB6.EXE, но когда приложение выполняет первый вызов метода в одном из классов .NET, оно выдает ошибку времени выполнения, указывающую " Ошибка автоматизации ".

В моих декларациях я создаю экземпляры следующих объектов из классов .NET, которые, кажется, работают нормально.

Private objSession As New Session
Private curFolder As Folder
Private colFolderTemplates As New FolderTemplateCollection
Private objLicense As New License

Однако ошибка автоматизации возникает во время выполнения при выполнении первой строки:

Call objSession.Configuration.Configure(connectionString)

Я попытался добавить dll-файлы .NET в тот же каталог, что и Release EXE-файл, и заново зарегистрировать tlb-файлы, но это не помогло. Любые предложения о том, что я мог бы проверить?

1 Ответ

0 голосов
/ 08 января 2011

Хорошо, снято в темноте.Попробуйте:

Явно добавьте новый объект Session (а также License и FolderTemplateCollection):

Private objSession as Session
Set objSession = new Session

Ошибка автоматизации указывает, что GUID из сборки .NET не сохраняются.Для этого сделайте это в своем коде C # - тогда это гарантирует, что все интерфейсы / классы / виртуальные таблицы сохраняются независимо от того, сколько раз вы компилировали свой код C #:

[Guid("9AC71CA7-6F82-44A3-9ABE-75354B514A46")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IManager
{
    [DispId(1)]
    void Display(ADODB.Recordset recordSet);
    [DispId(2)]
    void Close();
    [DispId(3)]
    string UserName { get; set; }
    [DispId(4)]
    string Password { get; set; }
    [DispId(5)]
    string Database { get; set; }
    [DispId(6)]
    string Server { get; set; }
    [DispId(7)]
    ICriteria Criteria { get; set; }
}

[Guid("B9BB5B84-8FBD-4095-B846-EC072163ECD3")]
[ClassInterface(ClassInterfaceType.None)]    
[ProgId("MyApp.Manager")]
public class Manager : IManager
{
    void Display(ADODB.Recordset recordSet) 
    {
    }
    ...
}
...