2011-06-01 1 views
4

J'ai écrit quelques méthodes d'extension de chaîne dans un assemblage VB et je les ai testées à partir d'un projet C#. Cependant, C# agit comme s'il ne pouvait pas voir les méthodes d'extension, quand d'autres projets VB référencent l'assemblage VB ils n'ont aucun problème. Le VB assem- blablement et le projet de test C# ciblent .Net 3.5.Les méthodes d'extension de l'assembly VB 2008 ne peuvent pas être utilisées dans un projet C#?

Y a-t-il un moyen de contourner cela?


VB.Net méthodes d'extension:

Imports System.Runtime.CompilerServices 
Imports System.Text.RegularExpressions 
Imports System.Linq 

Namespace ExtensionMethods 
    Module StringExtensions 

     <Extension()> _ 
     Public Function Remove(_ 
          ByVal input As String, _ 
          ByVal subStrings As String()) As String 
      ... 
     End Function 

     <Extension()> _ 
     Public Function Substrings(_ 
          ByVal input As String, _ 
          ByVal regexPattern As String, _ 
          ByVal regexOptions As RegexOptions) As IEnumerable(Of String) 
      ... 
     End Function 

     <Extension()> _ 
     Public Function Substrings(_ 
          ByVal input As String, _ 
          ByVal regexPattern As String) As IEnumerable(Of String) 
      ... 
     End Function 
    End Module 
End Namespace 

utilisation VB.Net:

Imports SomeNamespace.ExtensionMethods 
... 
someString = someString.Remove(subStringsToRemove) 

C# utilisation (ne fonctionne pas):

using SomeNamespace.ExtensionMethods;    //No error, but ExtensionMethods is not in the intellisense 
... 
someString = someString.Remove(subStringsToRemove); //error, can't find matching overlaod 
+3

Vous avez essayé de rendre le module 'Public'? – Kamarey

+0

Peut vouloir vérifier si vous pouvez invoquer explicitement (StringExtensions.Remove (someString, subStringsToRemove);) pour voir si elle peut même trouver la classe ... –

+0

@Kamarey, cela a fonctionné! N'hésitez pas à faire votre commentaire une réponse et je l'accepterai. Erreur stupide de ma part. – Matt

Répondre

3

Vous avez essayé de rendre le module 'Public'?

Mise à jour:

ne peut expliquer pourquoi il a travaillé avec d'autres ensembles de VB. Pensez que C# a sa propre vision des modificateurs d'accès de classe ou quelque chose.

+0

Je suis retourné et j'ai regardé le code, et même si j'avais l'intention d'utiliser les extensions ailleurs, je ne l'ai pas encore fait. Il n'a été utilisé que dans son assemblage de conteneurs. Les modificateurs d'accès par défaut pour les classes/modules dans VB sont internes, tout comme les classes C#. Je suppose que cela pourrait aussi arriver si l'ensemble 'InternalsVisibleTo' était réglé pour permettre à d'autres assemblées de voir un module comme celui-ci, mais ce n'est pas le cas ici. Merci pour la deuxième paire d'yeux pour attraper ma petite faute de frappe. – Matt

Questions connexes