2011-06-01 11 views
4

VBアセンブリでいくつかの文字列拡張メソッドを記述し、C#プロジェクトからそれらをテストしています。しかし、他のVBプロジェクトがVBアセンブリを参照しても問題ない場合、C#は拡張メソッドを見ることができないように動作します。 VB assemeblyとC#の両方のテストプロジェクトは.Net 3.5をターゲットにしています。VB 2008アセンブリの拡張メソッドはC#プロジェクトで使用できません。

方法はありますか?


VB.Net拡張方法:

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 

VB.Net使用:

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

C#の使用(動作しない):

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

モジュールを「パブリック」にしようとしましたか? – Kamarey

+0

明示的に(StringExtensions.Remove(someString、subStringsToRemove);)呼び出すことができるかどうかをチェックして、クラスを見つけることができるかどうかを確認したい場合があります。 –

+0

@Kamarey、それはうまくいきました!あなたのコメントを自由に回答して、私はそれを受け入れるでしょう。私の愚かな間違い。 – Matt

答えて

3

モジュールを「パブリック」にしようとしましたか?

更新:

他のVBアセンブリで動作した理由を説明できません。 C#にはクラスアクセス修飾子などの独自のビジョンがあると考えてください。

+0

私は戻ってコードを見ましたが、他の場所でエクステンションを使用しようとしていましたが、私はまだ行っていません。コンテナのアセンブリでのみ使用されています。 VBのクラス/モジュールに対するデフォルトのアクセス修飾子は、C#クラスのように内部的です。アセンブリが 'InternalsVisibleTo'を他のアセンブリがこのようなモジュールを見ることを許すように設定していたとしても、それはここでは当てはまりません。私の小さなタイプミスをキャッチする目の第二のペアに感謝します。 – Matt

関連する問題