使用COM Interop的VB6 App在IDE中运行良好,但编译了EXE崩溃

时间:2011-01-07 16:14:39

标签: vb6 interop

我目前正在使用VB6中的一个应用程序,该应用程序使用.NET 2.0框架使用C#编写的COM Interop库。

我使用regasm.exe使用/ codebase开关从.NET dll注册tlb文件。然后,我能够在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)

我尝试将.NET dll添加到与Release EXE相同的目录并重新注册tlb文件,但它没有帮助。关于我可以检查什么的任何建议?

1 个答案:

答案 0 :(得分:0)

好的,在黑暗中拍摄。要尝试的事情:

明确地新建了Session对象(以及License和FolderTemplateCollection):

Private objSession as Session
Set objSession = new Session

自动化错误表示.NET程序集中的GUID不是持久的。为此,请在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) 
    {
    }
    ...
}