使用COM互操作的VB6应用程序在IDE中运行良好,但编译的EXE崩溃

使用COM互操作的VB6应用程序在IDE中运行良好,但编译的EXE崩溃,vb6,interop,Vb6,Interop,我目前正在VB6中开发一个应用程序,它使用C#编写的COM互操作库,使用.NET2.0框架 我使用regasm.exe使用/codebase开关从.NET DLL注册tlb文件。然后,我就能够在VB6 IDE中成功地构建和运行应用程序,没有任何问题。NET代码使用一个配置文件,因此我将其添加到VB6目录中,并从配置中读取 然而,我随后从项目中编译了一个EXE文件,并在IDE运行的同一台机器上运行了它。正如我在调试VB6.EXE时所做的那样,我将EXE与配置文件耦合,但是当应用程序执行对某个.NE

我目前正在VB6中开发一个应用程序,它使用C#编写的COM互操作库,使用.NET2.0框架

我使用regasm.exe使用/codebase开关从.NET DLL注册tlb文件。然后,我就能够在VB6 IDE中成功地构建和运行应用程序,没有任何问题。NET代码使用一个配置文件,因此我将其添加到VB6目录中,并从配置中读取

然而,我随后从项目中编译了一个EXE文件,并在IDE运行的同一台机器上运行了它。正如我在调试VB6.EXE时所做的那样,我将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文件,但没有帮助。有什么建议吗?

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

显式新建会话对象(以及许可证和FolderTemplateCollection):

自动化错误表示.NET程序集中的GUID未持久化。要做到这一点,请在您的C代码中执行此操作—这样可以确保所有接口/类/虚拟表都能持久存在,无论您编译C代码多少次:


我注意到的一件事是,我的公共类型被限定为ComVisible,但我的程序集不是。如果我将程序集标记为ComVisible并为其分配GUID,这会有助于还是有害于这种情况?添加GUID不会有任何影响。似乎问题实际上源于.NET代码使用的配置文件-仍然不确定为什么它在IDE中使用相同的配置运行。但是我已经注意到了你上面的观点,以便将来有所改变。谢谢是的,在IDE中进行互操作和运行时,配置文件的问题很棘手,因为当您在IDE中启动应用程序时,VB6.exe是宿主应用程序,因此.config文件必须位于该文件夹中。我会查找procmon或filemon,以查看在各种情况下,实际上是什么受到了攻击。
Private objSession as Session
Set objSession = new Session
[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) 
    {
    }
    ...
}