10
votes

Référencement .NET Assembly dans VB6 ne fonctionnera pas

J'ai écrit un ensemble .NET à l'aide de C # pour effectuer des fonctions qui seront utilisées par le code géré et non géré. J'ai un projet VB6 qui doit maintenant utiliser l'assemblage via COM.

J'ai créé mon assembly .NET, garantissant que la commande est définie sur true et qu'elle est enregistrée pour com Interop via Propriétés du projet. P> xxx pré>

Je construisez l'assemblage et copié le fichier dans un dossier. Testinterop.dll p>

i ensuite exécutez un fichier de commandes pour enregistrer l'outil de montage pour enregistrer l'objet pour com. p> xxx pré>

i ouvrir une nouvelle application VB6 et référence testinterop.dll p>

in vb6 J'écrit le code suivant et il compile. P>

Run-time error' -2147024894 (80070002'):
Automation error
The system cannot find the file specified


0 commentaires

5 Réponses :


13
votes

Vous voudrez mettre votre montage .NET dans le GAC ou le regaz-exécutant de l'interrupteur de ligne de commande / codebase (il se plaindre, mais cela fonctionnera au moins). Aucun intellisense n'est normal, malheureusement.


1 commentaires

Travaillé comme un charme. Merci beaucoup! J'ai couru l'outil Regasm à l'aide de la commande / codebase. Le code / codebase crée également le fichier TLB pour vous. Merci à tous pour vos réponses.



4
votes

La dernière fois que j'ai vu que j'ai oublié de cadrer les GUDS. Donc, chaque fois que je recompante, VB serait incapable de trouver mon code. Ceci est un modèle de VB.NET. (N'utilisez pas ces GUDS, créez le vôtre.)

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "eaf83044-f0a7-417b-b333-e45aec398ca5"
    Public Const InterfaceId As String = "84e0fb8f-266d-40e6-9e8c-3d4eb37d3bf0"
    Public Const EventsId As String = "22ea2214-032f-4eb6-b2d4-c5dd213bab87"
#End Region

    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.
    Public Sub New()
        MyBase.New()
    End Sub

End Class


0 commentaires

0
votes

Je pense que le fichier TLB est généré dans le répertoire-cadre comme contre ce répertoire (C: \ Program Files \ Testapp).

Cela pourrait-il être le problème ici?


0 commentaires

1
votes

J'ai remarqué que vous n'avez pas besoin de courir le regas manuellement, il suffit de définir la propriété AssemblyInfo Propriété à VRAI:

[Assemblage: Comvissible (True)]

Vous pouvez également le faire en allant à Propriétés Propriétés -> Application -> Informations sur l'assemblage -> Faites de l'assemblage com visible et définissez la case à cocher.

Il n'est pas nécessaire d'enregistrer l'assemblage que vous créez dans le GAC afin de l'utiliser à partir de VB6.


0 commentaires

0
votes

J'avais l'erreur -2147024894 ou d'autres erreurs, quel que soit ce que j'ai essayé, jusqu'à ce que je dirigeais le code de consommateur VB6 directement à partir de EXE. Quelque chose sur le débogueur VB6 qui empêchait de me permettre d'utiliser la DLL au moment de l'exécution. Je ne pouvais même pas instancier l'objet. Je pourrais référencer la TLB au moment de la conception et disposait également d'un soutien parfait intellectuel. Dès que j'ai lancé l'application en dehors de Visual Studio, tout fonctionnait parfaitement. J'espère que cela aide quelqu'un.


0 commentaires