2011-01-07 46 views
4

我目前正在使用.NET 2.0框架使用C#編寫的COM Interop庫的VB6中的應用程序。使用COM Interop的VB6應用程序在IDE中正常工作,但編譯EXE崩潰

我用regasm.exe來使用/ codebase開關從.NET dll註冊tlb文件。然後,我能夠在VB6 IDE中成功構建和運行應用程序,而不存在任何問題。 .NET代碼使用配置文件,所以我將它添加到VB6目錄,並從配置中讀取正確。

然後,我從項目中編譯了一個EXE文件,並在運行它的同一臺機器上運行它。正如我在調試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到同一目錄中推出EXE和重新註冊的tlb文件,但它沒有幫助。關於我可以檢查的任何建議?

回答

0

好的,在黑暗中拍攝。您可以嘗試:

明確了新的Session對象(以及許可和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) 
    { 
    } 
    ... 
} 
+0

有一兩件事我注意到的是,我的公開類型被限定爲ComVisible,但我的程序集不是。如果我將這些程序集標記爲ComVisible併爲它們分配一個GUID,是否會對情況有所幫助? – 2011-01-10 20:07:42

相關問題