2010-07-23 3 views
3

J'ai un projet de site Web ASP.NET dans lequel j'utilise à la fois des fichiers de classe VB.Net et C#. J'ai inclus des sous-dossiers séparés dans le répertoire App_Code pour les classes de chaque langue.Utilisation d'une classe VB du même projet de site Web ASP.NET dans une classe C#

Cependant, bien que je puisse utiliser avec succès une classe C# dans une classe VB, je ne peux pas faire le contraire: utiliser une classe VB dans une classe C#.

Ainsi, pour illustrer, je pourrais avoir deux classes comme celle-ci:

Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 
End Class 

public class CSTestClass 
{ 
    public CSTestClass() 
    { 
    } 
    public string HelloWorld(string Name) 
    { 
     return Name; 
    } 

} 

je peux utiliser la classe CS dans ma classe VB, avec la mention « Importations ». Donc, cela fonctionne bien:

Imports CSTestClass 
Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 

    Private Sub test() 
     Dim CS As New CSTestClass 
     CS.HelloWorld("MyName") 
    End Sub 
End Class 

Mais en utilisant de la classe VB dans mon C#, avec le « en utilisant » déclaration, ne fonctionne pas:

using VBTestClass; 
public class CSTestClass 
{ 
     public CSTestClass() 
     { 
    } 

    public string HelloWorld(string Name) 
    { 
     return Name; 
    } 
} 

je reçois une erreur « du type ou l'espace de noms "VBTestClass" n'a pas pu être trouvé ". Qu'est-ce que j'oublie ici?

Répondre

0

l'instruction à l'aide est pour les espaces de noms pas les noms de classe, mettez l'VBClass dans un espace de noms, puis, utilisez le "en utilisant" déclaration:

Namespace MyFoo 
Public Class VBTestClass 
    Public Sub New() 
    End Sub 

    Public Function HelloWorld(ByVal Name As String) As String 
     Return Name 
    End Function 
End Class 
End Namespace 

maintenant C#:

using MyFoo; 

... 
+0

J'ai essayé cela, mais j'ai le même problème de "type ou espace de noms non trouvé" ... ??? –

0

la différence est dans la façon dont le mot-clé Imports fonctionne par rapport au mot-clé using. Le mot clé using peut uniquement être utilisé pour spécifier des espaces de noms, tandis que le mot clé Imports peut également être utilisé pour spécifier des classes. Donc, Imports CSTestClass Donc, Imports CSTestClass spécifie que les classes, les interfaces et les énumérations à l'intérieur de cette classe doivent être disponibles, mais la classe n'en contient aucune, donc l'instruction Imports n'est pas nécessaire.

Lorsque vous essayez d'utiliser using VBTestClass cela ne fonctionnera pas, car VBTestClass n'est pas un espace de noms. Donc, il suffit de supprimer les instructions Imports et using, et cela devrait fonctionner correctement. Comme les classes sont dans le même assemblage, elles se connaissent déjà.

+0

Merci beaucoup - des informations très utiles. Cependant, j'ai essayé d'encapsuler la classe VB dans un espace de noms (comme dans la réponse précédente), et de supprimer les instructions Imports et Using (en faisant juste usage de la classe directement en supposant qu'ils se connaîtraient l'un l'autre le même assemblage). Cependant, j'ai toujours le même problème ... –

1

La meilleure façon d'utiliser l'option/Imports en tant que raccourci pour ignorer les espaces de noms entièrement qualifiés. Le comportement est le même pour vb et C#.

Tenir compte des exemples:

entièrement qualyfying:

void DoSomething() 
{ 
    var p = new Interfaces.CPDATA.DataHolders.Placement(); 
} 

sauter les espaces de noms:

using Interfaces.CPDATA.DataHolders; 
void DoSomething() 
{ 
    var p = new Placement(); 
    var t = new Trade(); 
}  

et un petit truc de raccourci

using data = Interfaces.CPDATA.DataHolders; 
void DoSomething() 
{ 
    var p = new data.Placement(); 
    var t = new data.Trade(); 
} 

et un tour de remplacement: Comme pour les fichiers de code dans différentes langues dans le dossier ASP.NET App_Code: NE L'UTILISEZ PAS. Pour:

  • ils ne fonctionneront pas lors de l'utilisation projet d'application Web
  • ils ne compilera pas lors de l'utilisation csc ou compilateur vbc dans le projet d'intégration continue en dehors de Visual Studio
  • et ils vous donneront généralement beaucoup de la douleur sur le côté infrastructure des choses.

La meilleure façon consiste à créer des projets de bibliothèque de classes distincts pour le langage respectif et à les utiliser. En plus de cela, il y a beaucoup de choses intéressantes en cours d'exécution de ce projet sous Visual Studio et iis. Si vous êtes curieux, vous pouvez jeter un oeil à divers fichiers assis dans

\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\{project name}\{tempname} 

il devrait vous donner une bonne idée de comment moteur asp.net combine les fichiers de code pour les pages ASPX. Destiné à cette information inutile, nous pouvons maintenant dire qu'avoir une classe CSTestClass dans la même instruction namespace "Imports CSTestClass" n'est pas vraiment utile. Un bon style de codage serait de les avoir toutes enveloppées dans des instructions d'espaces de noms MyWebProject.VbCode et MyWebProject.CsCode par exemple. Les instructions "using MyWebProject.VbCode" et "Imports MyWebProject.CsCode" auraient plus de sens pour le compilateur.

2

Je pense que j'ai trouvé le problème et semble sans réflexion que vous ne pouvez pas le faire comme référence croisée.

La raison est assez simple, dépend la façon dont les commandes que vous définissez vos codeSubDirectories, je pense que vous l'avez fait de cette façon:

<codeSubDirectories> 
    <add directoryName="CSCode"/> 
    <add directoryName="VBCode"/> 
</codeSubDirectories> 

Comme nous le savons chaque répertoire sera construit à l'assemblage différent, et ils seront Construire un par un de haut en bas en fonction de vos paramètres. Comme vous avez d'abord défini le dossier CSCode, il sera construit en premier, puis le compilateur commencera à construire le VBCode, donc utiliser la classe CS est OK car il peut trouver l'assembly à référencer. Mais si vous le faites de manière inverse, comme vous l'avez mentionné pour référencer le code VB dans CS, créez d'abord le dossier CSCode et à ce moment-là l'assembly de VBCode n'existe pas alors il lance des exceptions.

Donc, pour le faire fonctionner avec CS en utilisant VB, tout simplement changer l'ordre de réglage du dossier:

<codeSubDirectories> 
    <add directoryName="VBCode"/> 
    <add directoryName="CSCode"/> 
</codeSubDirectories> 

Mais alors vous perdrez la possibilité d'utiliser une classe CS en VB que cette fois balises BB compiler en premier.

Donc, ma suggestion est d'aller avec la réflexion pour le charger au moment de l'exécution afin que le compilateur puisse vous laisser partir.

J'espère que mon explication est assez claire.

Merci

Questions connexes