2010-11-18 8 views
3

J'ai créé un assembly fortement signé dans Visual Studio 2008 par rapport à la structure .NET 3.5 (j'ai également essayé le framework 2.0). J'ai exposé une classe comme COM visible, et je suis capable de trouver cette DLL dans le navigateur d'objets de Visual Studio 6 pour Visual Basic. Je peux créer un exe dans VB6 et exécuter cet exe directement à partir de Windows Explorer, et tout fonctionne bien. Cependant, lorsque je tente d'exécuter le projet VB6 dans Visual Studio 6 l'ensemble .net ne veut pas charger et échoue avec l'erreur suivante:Visual Studio 6 ne peut pas charger une DLL COM compilée dans .net 2.0

ActiveX component can't create object 

Je reçois aussi cette erreur au lieu de celui ci-dessus, en fonction sur la façon dont je me inscrire la dll:

-2147024894 File or assembly name (myComponentName), or one of its dependencies, was not found. 

Ou ceci:

-2146233082 Automation error 

J'ai essayé tout ce que je peux penser. Il semble que ce serait un problème avec la façon dont VS6 s'exécute en mode débogage. Peut-être que l'environnement est différent avec un chemin manquant à ceci ou à un autre dll. J'ai ce problème sur deux machines de développement différentes. Je peux également faire référence à une DLL COM .net qui a été créée par un autre développeur en utilisant une ancienne version de Visual Studio .net. J'ai même ouvert la dll avec walker de dépendances et je n'ai pas eu d'erreurs évidentes.

MISE À JOUR: moniteur Proc dit que VB6 est à la recherche de mon dll dans le studio VB6 répertoire "C: \ Program Files \ Microsoft Visual Studio \ VB98 \ MyDLL.DLL" au lieu où la DLL est enregistrée . Je mis la dll là-bas et enregistré, maintenant je reçois une nouvelle erreur:

-2146234105 (80131107) "The format of the file 'MyDllName' is invalid." 

Alors, pourquoi studio cherche mon DLL et il pas où il est enregistré? Comment puis-je résoudre ce problème? À tout le moins, comment puis-je obtenir le dll de travailler dans le répertoire "C: \ Program Files \ Microsoft Visual Studio \ VB98 \" dossier

Mise à jour finale/SOLUTION: Ok, alors je me suis le problème . Cela a à voir avec VB6.exe étant verrouillé hors de la version du framework .net que j'utilisais (2.0 ou 3.5). J'ai trouvé ce fichier « C: \ Program Files \ Microsoft Visual Studio \ VB98 \ vb6.exe.config » qui contenait l'entrée suivante:

<configuration> 
    <startup> 
     <supportedRuntime version="v1.1.4322" /> 
    </startup> 

Dès que je l'ai enlevé ce fichier dll a commencé à travailler à partir de la fin environnement visuel studio 6. Merci à tous ceux qui ont répondu à l'aide.

+2

Je pense que quelque chose est valide dans votre chemin OS qui charge l'un de vos DLL de référence gérées ou non. Comme je me souviens de VS6, il ignore les chemins d'OS donc vous devez ajouter le chemin vers VS6. – kenny

+0

Juste vérifier - vous avez. NET 2.0 installé sur la boîte fonctionnant avec Visual Studio 6, oui? –

+0

J'ai installé Visual Studio 6, 2005 et 2008 ... et 2005 ou 2008 installé .net 2.0 avec. La DLL fonctionne très bien lorsqu'elle est appelée à partir d'un autre projet de studio 2008, ou lorsqu'elle est utilisée dans l'application VB6 lorsqu'elle est appelée à partir de Windows Shell (explorateur). Seul l'environnement IDE VB6 ne fonctionne pas. – Alex

Répondre

3

Ok, donc je me suis le problème. Cela a à voir avec VB6.exe étant verrouillé hors de la version du framework .net que j'utilisais (2.0 ou 3.5). J'ai trouvé ce fichier « C: \ Program Files \ Microsoft Visual Studio \ VB98 \ vb6.exe.config » qui contenait l'entrée suivante:

<configuration> 
    <startup> 
     <supportedRuntime version="v1.1.4322" /> 
    </startup> 

Dès que je l'ai enlevé ce fichier dll a commencé à travailler à partir de la fin environnement visuel studio 6. Merci à tous ceux qui ont répondu à l'aide.

2

Une cause fréquente de la première erreur est d'exécuter Regasm.exe sans l'option de ligne de commande/codebase.

La deuxième erreur est 0x8007002, une erreur Windows, "Fichier introuvable". Ceci est susceptible d'être généré par une exception dans votre code managé.

La troisième erreur est 0x80131506, le code d'exception géré pour "erreur fatale du moteur d'exécution". C'est une mauvaise chose, généralement induite par le fait que le code non géré corrompt le tas collecté.

De toute évidence, vous n'avez pas vraiment de problèmes d'enregistrement, vous obtenez des exceptions gérées. Mais oui, ils sont difficiles à diagnostiquer quand vous ne pouvez plus voir les belles exceptions .NET avec leurs traces de pile. Corrigez cela en utilisant le débogueur. Projet + Propriétés, onglet Déboguer, sélectionnez "Démarrer le programme externe" et sélectionnez votre programme vb6. Définissez un point d'arrêt sur le code que vous souhaitez tester. Il va frapper dès que le programme vb6 l'appelle.Debug + Exception, Thrown cases à cocher est un autre bon moyen de résoudre les exceptions gérées, le débogueur s'arrête à l'instruction throw. Bien que ce ne soit pas votre code qui lance, regardez la pile d'appels.

Vous pouvez même sélectionner VB6.exe à partir du répertoire d'installation VS6. Maintenant, vous pouvez déboguer le code vb6 et le code managé.

+0

Merci pour votre suggestion. Malheureusement, j'ai obtenu les mêmes résultats qu'avant. Lors du démarrage du programme compilé vb6 exe tout fonctionnait parfaitement sans erreurs. Quand j'ai choisi de commencer avec vb6.exe j'ai eu la même erreur 8007002 comme je recevais avant. Cela ne semble pas être des exceptions gérées. Peut-être un problème de chemin dans VS6 IDE comme d'autres mentionnent dans les messages ci-dessus, mais je n'ai pas été en mesure de résoudre ce problème pour le moment. – Alex

+2

L'utilisation de COM force la traduction de toutes les exceptions gérées en code d'erreur. Oui, ne pas utiliser le chemin complet d'un nom de fichier est une source probable de l'erreur. Utilisez l'outil ProcMon.exe de SysInternals, vous pourrez le voir à la recherche du fichier et échouer. Le nom du fichier devrait vous donner un très bon indice. –

+0

Vous avez raison! Proc surveille indique que VB6 recherche ma DLL dans son répertoire personnel "C: \ Program Files \ Microsoft Visual Studio \ VB98 \ MyDLL.DLL" au lieu d'où la DLL est enregistrée. J'ai placé la DLL là et l'ai enregistrée, maintenant je reçois une nouvelle erreur: -2146234105 (80131107) "Le format du fichier" MyDllName "est invalide." – Alex

Questions connexes