Question

J'essaie de résoudre ce problème depuis longtemps et rien ne semble fonctionner.

J'ai une DLL COM écrite en vb6. J'ajoute une référence à cette DLL dans .net, avec les propriétés 'isolated' et 'copy local' définies sur true sur la référence. Apparemment, cela est censé permettre une communication sans enregistrement.

Mais ça ne marche pas. Si j'essaie sur un autre ordinateur ou annule l'inscription de la DLL avec regsvr32, toute tentative d'accès à la DLL génère une exception (indiquant essentiellement que la classe com souhaitée n'existe pas). Les fichiers DLL et manifestes se trouvent dans le même dossier que le fichier EXE, mais il les ignore apparemment totalement.

Qu'est-ce que je fais mal? J'ai lu une tonne d'articles épars à ce sujet mais aucun d'eux ne me donne de solution de travail. J'ai bricolé avec Visual Studio en vain. J'ai bricolé une petite quantité avec le make-my-manifest, mais cela n'a pas fonctionné (même sur un projet test).

Était-ce utile?

La solution

Je créais et utilisais la classe com sur un thread non-ui. Apparemment, Reg-Free com sur les DLL vb6 ne fonctionne pas dans cette situation. Ce code de test le montre:

Private Sub RunTest() Handles Button1.Click
    Try
        Dim x As New RegTestProject.RegTestCall
        MsgBox(x.RegTestFunction())
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try
End Sub

Private Sub RunThreadedTest() Handles Button2.Click
    'fails if reg-free COM is used'
    Dim t As New Threading.Thread(AddressOf RunTest)
    t.Start()
End Sub

Lorsque je lance ceci avec la DLL enregistrée normalement, les deux tests aboutissent. Si j'utilise com-reg-free, le test par thread échoue même si le test normal réussit toujours. On dirait que cela va être une énorme douleur à contourner.

Autres conseils

Je suis presque sûr que lorsque vous référencez les composants COM de cette manière, l'importation des composants COM a lieu à chaque fois que vous construisez. Cela signifie que le composant COM doit être enregistré de manière traditionnelle sur chaque machine sur laquelle le projet sera construit.

Voici un lien décrivant l'utilisation de l'enregistrement. communication gratuite Si vous avez déjà fait cela, postez votre fichier manifeste. Il se peut que vous manquiez d’une faute de frappe.

Modifier

Juste une idée pourrait être plus simple de simplement enregistrer la dll la première fois que l'application s'exécute sur une nouvelle machine. L'enregistrement gratuit com interopt n'est disponible que sous Windows XP et versions ultérieures. Par conséquent, si vous ciblez des dinosaures, cela ne fonctionnera pas.

Voici un extrait de la Dépannage d'une section MSDN article sur COM-reg. Toutes mes excuses si vous l'avez déjà vu. La bonne nouvelle est que vous faites déjà partie des étapes. Il suggère de reproduire le problème dans Windows Server 2003 (peut-être avec PC virtuel .). ?), puis le journal des événements devrait aider.

  

Commencez par ... travailler avec votre client   un serveur enregistré; puis désinscrire   le serveur et vérifiez que votre erreur   le message est ce que vous attendiez; et   enfin ... manifeste de métier et de déploiement   des dossiers. De cette façon, votre dépannage   les efforts ... se limiteront à la   structure de vos fichiers manifeste (et   l'intégration correcte de l'assemblage   manifeste si vous choisissez de le faire).

     

Lors du dépannage sans inscription   Problèmes COM, Observateur d'événements sur   Windows Server 2003 est votre ami ...   Recherchez dans le journal des événements système les événements du serveur COM.   Je ne suggère pas que vous regardez la   Journal des événements Windows XP ...   il contiendra invariablement un   message ... qui n'aide pas   identifier le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top