我目前正在开发一个 VB6 中的应用程序,该应用程序使用使用 .NET 2.0 框架用 C# 编写的 COM 互操作库。
我使用 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 文件,但没有帮助。对我可以检查什么有什么建议吗?
好吧,在黑暗中拍摄。值得尝试的事情:
显式新建会话对象(以及许可证和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)
{
}
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)