2009-09-28 8 views
0

Certaines des sources que j'ai vérifié déjà: http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_23359339.html
http://mygreenpaste.blogspot.com/2006/03/net-framework-20-configuration-tool.html
http://support.microsoft.com/kb/186063VB6 Erreur d'automatisation sur les appels à .NET 3.5 Assemblées Après les premiers appels

que je développe occupé des modules .NET qui accrochera dans notre code VB6 existant. J'ai créé un projet VB6 de test à partir duquel lancer le nouveau code qui comprend d'une forme avec un bouton, et est

Dim launcher As New VB6InteropLaunchPad.launcher 
launcher.FormTypeEnum = FormTypeEnum_MySpecificForm 
launcher.launchAppropriateForm 

événement click du bouton Il réussit la première fois que je clique sur le bouton. Toutefois, si je clique sur le bouton à nouveau, je reçois l'erreur suivante:

Run-time error '-2146233079 (80131509)': Automation Error 

Les appels suivants du code .NET échoue avec le même message d'erreur à moins que je fermer et redémarrer l'IDE. Si je compile le projet VB6 à un EXE, la même chose se produit. Je dois fermer l'EXE et le réexécuter pour pouvoir accéder au code .NET.

J'ai essayé la suggestion http://support.microsoft.com/kb/186063 et a fait ce qui suit: Option Explicit

' http://support.microsoft.com/kb/186063 

Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000 

Private Declare Function FormatMessage Lib "kernel32" Alias _ 
    "FormatMessageA" (ByVal dwFlags As Long, lpSource As Long, _ 
    ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _ 
    ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) _ 
    As Long 

Private Function MessageText(lCode As Long) As String 
    Dim sRtrnCode As String 
    Dim lRet As Long 

    sRtrnCode = Space$(256) 
    lRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0&, lCode, 0&, _ 
        sRtrnCode, 256&, 0&) 
    If lRet > 0 Then 
     MessageText = Left(sRtrnCode, lRet) 
    Else 
     MessageText = "Error not found." 
    End If 
End Function 

On Error GoTo errHandler 
    Dim launcher As New VB6InteropLaunchPad.launcher 
    launcher.FormTypeEnum = FormTypeEnum_MySpecificForm 
    launcher.launchAppropriateForm 
    Exit Sub 

errHandler: 
    MsgBox MessageText(Err.Number) 
    MsgBox Err 

mais l'erreur n'a pas été trouvé.

Des idées pour résoudre ce problème? J'ai essayé de set launcher = Nothing mais ça n'aide pas.

Merci les gars.

Répondre

4

donné tout c'est impliqué ici, je ne pense pas qu'il y ait suffisamment d'informations pour faire une proposition utile quant à la question réelle. Si j'étais dans votre situation, la première chose que je ferais probablement est déboguer le composant .NET dans Visual Studio afin de voir si le problème est une exception non gérée provenant du composant .NET:

  1. (en option, mais souvent utile) Configurez le projet VB6 pour générer un fichier PDB pendant la compilation. Ouvrez le projet VB6 et accédez à l'élément de menu Projet -> Propriétés de MyProject. Sélectionnez l'onglet "Compiler" et cochez "Créer des informations de débogage symboliques"
  2. Compilez le projet VB6 (Fichier -> Créer MyProject.exe).
  3. Ouvrez le projet/la solution du composant .NET, accédez à l'élément de menu Projet -> Propriétés MyDotNetProject .... Sélectionnez l'onglet "Debug". Définissez "Start Action" sur "Start External Program" et accédez au fichier .exe généré via l'étape 2.
  4. (facultatif, mais souvent utile) Cochez "Activer le débogage de code non géré".
  5. Déboguer!

J'espère que vous allez essayer le même scénario que vous avez décrit et cette fois, il provoquera une exception qui, à son tour, provoque le débogueur VS sur la ligne fautive du code .NET. Si vous ne voyez aucun changement de comportement, il peut être utile d'accéder à l'élément de menu Debug -> Exceptions ... (dans VS) et de cocher la case appropriée pour rompre immédiatement lorsqu'une "Exception Common Language Runtime" est jeté.

+0

Merci M. Pratt! S'il vous plaît voir mon commentaire complet au bas de la page. – AndrewJacksonZA

0

Google a proposé la suggestion suivante de quelqu'un avec le same automation error in a similar interop situation.

The only slightly unusual thing was that my exposed class inherits from a base class. Because I don't want the base class exposed to COM it was decorated with [ComVisible(false)] . When I finally removed this decoration from the base class the COM class worked in VB6.

So it seems mscorlib does not want to expose a .NET class to COM if its base class is not visible. My lesson is that classes which are to be exposed should not inherit. They should single classes that delegate to a contained instance of the class that really does the work.

0

Merci, monsieur Pratt! J'ai fait ce que vous avez suggéré en traversant le code .NET et j'ai découvert que je devais ajouter un try/catch où mon code .NET démarre (le projet humoristique "VB6LaunchPad"):

Application.EnableVisualStyles(); 
try 
{ 
    Application.SetCompatibleTextRenderingDefault(false); 
} 
catch (InvalidOperationException) 
{ 
    // Do Nothing 
} 
// Some DevExpress init code 
SkinManager.EnableFormSkins(); 
LookAndFeelHelper.ForceDefaultLookAndFeelChanged(); 

Application.EnableVisualStyles(); et Application.SetCompatibleTextRenderingDefault(false); sont-ils nécessaires?

(Désolé de ne pas afficher ce commentaire comme commentaire, il faisait plus de 600 caractères.)

Questions connexes