1

特定の名前空間に Web サービスがあります。それを と呼びましょうMyNamespace。これは、コード ビハインドに webmethods を含む通常の Web サービスです。これらの Web メソッドで使用されるすべての種類のクラスを含む追加の .cs ファイルもあります。ここまでは順調ですよね?

次に、テストのみに使用される追加の Web サービスがあります。コードビハインドはなく、そのコードは .asmx ファイルに直接含まれているため、何も再構築せずにサーバーにすばやくアップロードできます。このテスト Web サービスはMyNamespace、最初の段落で説明した Web サービスと同じ名前空間にあり、同じプロジェクトにもあります。の内部メンバーにアクセスしようとするまで、それはうまく機能しますMyNamespace。それはできません。それらは非公開であるかのように見えません。

ここからナンセンスなことを書き始めるかもしれませんので、必要に応じて訂正してください。少し調べてみましたが、適切なコードビハインドのない.asmxは実行時にコンパイルされ、適切なアセンブリの一部ではないため、これは「意図された」ようです。内部メンバーはアセンブリ内でのみ使用できるため、.asmx コードで使用できないのはまったく問題ありません。私の質問は、私のコードを .asmx.cs 分離コード ファイルに移動せずに、何らかの方法でこれらのメンバーにアクセスできるかということです。

4

1 に答える 1

1

これはリフレクションを使用して可能だと思います。

例: パブリック クラスで内部メソッドを呼び出すには:

var myPublicClass = new PublicClass;
MethodInfo mInfo = typeof(PublicClass).GetMethod("InternalMethodName", BindingFlags.Instance | BindingFlags.NonPublic);

var result = mInfo.Invoke(myPublicCLass, null) // (replace null with an array of parameters if necessary)

または、内部クラスのインスタンスで作成するには:

MethodInfo mInfo= Type.GetType(assemblyQualifiedName).GetConstructor(
                        BindingFlags.NonPublic | BindingFlags.Instance,
                        null,
                        new[] { typeof(string) },
                        null
                    );
object myInstance = mInfo.Invoke(new[] { "constructorArgument" });

編集:内部静的クラスの内部静的メソッド:

MethodInfo mInfo = Type.GetType(assemblyQualifiedName).GetMethod("InternalMethodName", BindingFlags.Static| BindingFlags.NonPublic);

var result = mInfo.Invoke(null, null) // (replace 2nd null with an array of parameters if necessary)
于 2013-09-25T10:22:02.740 に答える