4

この問題の長さについてお詫び申し上げますが、皆さんはそれが価値があると思うと思います。私が始める前に、私はで、実際にはで、独立したコンソールアプリケーションを制作しようとしましたが、悲しいことにそれは不可能であることが証明されました。このバグはコンソールアプリケーションでは発生しません。これは、内蔵のASP.NETアプリケーションでは発生しません。 Windows 7上でIIS 7.5内で実行された場合にのみ発生します。__TransparentProxy(WCF経由)とdynamic(int)の組み合わせが含まれるため、エラーは動的言語ランタイムに関連しているようです。問題を引き起こす行は、プロキシと動的intの両方を渡す静的メソッド(メソッド本体を含まない)が呼び出されることです。IIS 7.5と組み合わせた動的言語ランタイムのバグ

このメソッドが呼び出されると、w3wp.exeプロセスはCPU全体を占有し、メモリを非常に高速に増加させます(私にとっては、毎秒100メガ程度ですが、おそらくGCのためにテーパーが消えます)。

このエラーを再現するには、Visual Studio( "新規" | "プロジェクト" "C#" | "Web" | "ASP.NET Webアプリケーション")で新しいASP.NET Webサイトを作成します。その後、新しいプロジェクトをホームディレクトリとするIISで新しいサイトを作成します。 (また、 "Everyone"にそのフォルダへの完全な読み取り/書き込みアクセス権を与え、アプリケーションプールが.NET 4.0を使用していることを確認してください)新しいサイトに7080などの特定のポートを与えます。最後に、このコードをGlobal.asax.csに貼り付けます:

public class Global : System.Web.HttpApplication 
{ 
    void Application_Start(object sender, EventArgs e) 
    { 
     dynamic dynamicId = 5; 

     var serviceUrl = "http://localhost:7182/FooServices.svc"; 
     ChannelFactory factory = new ChannelFactory<IFooServices>(new WSHttpBinding(), new EndpointAddress(serviceUrl)); 
     factory.Open(); 
     IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel(); 

     BlowUpTheProgram(fooServices, dynamicId); // This line hangs 
    } 

    [ServiceContract] 
    public interface IFooServices 
    { 
     [OperationContract] 
     void Bar(); 
    } 

    public static void BlowUpTheProgram(IFooServices eventServices, int authorMailboxId) 
    { 
    } 
} 

http://localhost:7080(またはあなたが選択したポート)からブラウザにアクセスしてください。報告された症状を確認した後、w3wp.exeプロセスを強制終了したいので、タスクマネージャを準備しておいてください。

、プロキシと動的にはこのバグを表面に一緒に働いていることを確認し、この行を変更するには、次へ

dynamic dynamicId = 5; 

を:

int dynamicId = 5; 

再試行し、問題がなくなったわかります離れてページが読み込まれます。今dynamicに戻ってそれを変更してから、この行を変更:

IFooServices fooServices = ((ChannelFactory<IFooServices>)factory).CreateChannel(); 

へ:

IFooServices fooServices = null; 

再試行を、あなたは再び問題があまりにもこのシナリオでなくなって気づくでしょう。

最後に、デバッガを接続してすべてをブレークすると、このメソッド呼び出しでスタックしている間に何をしているのかがわかります。それは、常にのようなものを示しているようだ:!

がmscorlib.dll System.RuntimeMethodHandle.GetDeclaringType(System.IRuntimeMethodInfo法)+ 0x2fバイト
がmscorlib.dll System.Reflection.Emit.DynamicResolver.ParentToken(int型トークン! )+ 0x1f3バイト

[マネージド移行にネイティブ]
のMscorlib.dll!System.Reflection.Emit.DynamicMethod.CreateDelegate(のSystem.Type delegateType、オブジェクトターゲット)+ 0x29バイト
システム[ネイティブへの遷移管理] .Core.dll!System.Linq.Expressions.Expression> .Compile()+ 0xbbバイト
System.Core.dll!System.Runtime.CompilerServices.CallSiteBinder.BindCore>(System.Runtime.CompilerServices。(System.Runtime.CompilerServices.CallSite site = {System.Runtime.CompilerServices.CallSite>}、WebApplication1)。グローバルarg0 = {ASP.global_asax}、WebApplication1.Global.IFooServices arg1 = {System.Runtime.Remoting.Proxy.__ TransparentProxy}、オブジェクトarg2 = 5)+ 0x3f0バイト
WebApplication1.dll!WebApplication1.Global.Application_Start(オブジェクト送信者= {System.Web.HttpApplicationFactory}、System.EventArgs E = {System.EventArgs})ライン19 + 0x1b8バイトレコードのC#

は、私は、3台の異なるマシン上でそれを試してREPROすることができたましたWindows7/IIS7.5のボックスにのみ表示されます。 Windows Server 2008/IIS7ボックスに問題はありませんでした。

質問は、この問題をどのように解決してメソッドを呼び出すのですか?また、なぜこれは起こっているのですか?私は、IISがクラッシュするため、DLRを使用するものを呼び出すことに過度に注意する必要はありません。

+0

あなたの質問は何ですかカーク? –

+0

質問は、「どうやってこのメソッドを呼び出すのですか? –

+0

ダイナミックを使用する必要がありますか?私はちょうど問題を解決するかどうか、それを壊す理由を探しているかどうか疑問に思っていますか?動的な使用を決定づける要因は何ですか? –

答えて

6

私は答えができませんなぜこの問題が発生しますが、dynamicオブジェクトをintにキャストするとパラメータが渡されます。

おそらく、内部の知識が豊富な人は、より深い探求をしていきます。

+0

質問に答えることができない場合、なぜ回答を提出しましたか?このようなことはコメントではなく、回答でなければなりません。あなたの最初の行を見ました... – Phil

+2

私は質問に答えます。なぜそれが機能していないのではなく、それを解決する方法でした。それは最初に投稿されて以来少し変わってきましたが、ここで私はなぜその理由なしに答えます。 –

+1

@Phil、私はJamieが非常に有用な答えを提供したと思います。完全に率直であるために、SOはこの質問にアップアップがない場合、もう少し質問を「ショーケース」します。 ( "Unaswered Questions")しかし、私は完全にこの回答をupvotingしようと思っています。最終的に、私はいくつかの他の意見やより多くの注意を得ることを期待して、これについて賞金を払うと思う。しかし、ジェイミーは非常に助けになりました。 –

関連する問題