2016-05-02 14 views
-1

私が取り組んでいる従来のASP.Net Web Formsアプリケーションにいくつかの変更を加えた後、アプリケーションのページにアクセスしようとするたびに次の例外が発生しました。コードビハインドクラスでジェネリックメソッドを使用すると、動的コンパイル例外が発生するのはなぜですか?

C:\ WINDOWS \ Microsoft.NET \ Frameworkの\ v4.0.30319 \ ASP.NETの一時ファイル\ MyApplicationを\ bdb24adf \ eb592999 \ App_Web_mypage.aspx.cdcab7d2.dc1wid-d.0.cs(148):エラーCS0012:タイプ 'MyDataModelClass'は、参照されていないアセンブリで定義されています。あなたは、アセンブリへの参照を追加する必要があります「MyDataModelAssemblyバージョン= 40.0.0.30を、カルチャニュートラル、PublicKeyToken = = 7ca3fb5049101832」

は、トラブルシューティングの時間後、私は最終的に私がベースに追加した方法に問題を絞り込みますアプリケーションのすべてのページが派生するページクラス。それをMyBasePageClassと呼んでください。

protected T CreatePlaceholder<T>(T item) where T : MyDataModelClass, new() 
{ 
    return new T { TemporaryIdentifier = item.TemporaryIdentifier }; 
} 

私がそのメソッドをコメントアウトすると、例外がなくなり、すべてが期待通りに機能します。 web.configファイルにアセンブリ参照を追加すると、この例外もなくなります。奇妙なことに、Copy Local = trueへの参照を変更すると、例外もなくなります。

MyDataModelClassがアプリケーションに組み込まれたのは初めてのことではありません。これは、ファイルのほぼすべてのコードの後ろの場所で使用されます。しかし何らかの理由で、型制約として使用することは.Netが処理できる以上のものです。

私はそれがジェネリックスの性質と関係があると想像することができますが、私はそれが何であるか分かりません。私はこれを試した最初の人にすることはできませんが、私はそれについての情報をどこにでも見つけることができません。 IISの設定方法と関係がありますか?

更新:

MyDataModelAssemblyが実際にGACにインストールされています。

グローバルアセンブリキャッシュには、次のアセンブリが含まれます:ここます。gacutil/lでの出力である MyDataModelAssemblyは、バージョン= 40.0.0.30、カルチャニュートラル、PublicKeyToken = = 7ca3fb5049101832、processorArchitecture = MSIL

+1

なぜ投票が下りましたか? –

+0

私は誰がこの質問に投票を続けているか知りたいです。質問の上下投票の全目的は、よく研究され、難しい質問が上に上がり、質の低い質問が下に落ちるようにすることです。誰もこの質問に対して良い答えを得ていないように思えるので、トップに上がる必要があります。 –

答えて

-1

The type 'MyDataModelClass' is defined in an assembly that is not referenced. You must add a reference to assembly 'MyAssembly, Version=40.0.0.30, Culture=neutral,

あなたは実際に、そのクラスが定義されているアセンブリ(DLL)にあなたのプロジェクトの参照を持っていますか?エラーはあなたがそうしないと思っています。ここにDLLを追加し、ローカルコピーに設定することで

修正それを:

enter image description here

+0

はい、プロジェクトに参照があります。アプリケーションはVisual Studioでうまく構築されます。 IISがコンパイルエラーが発生したページを提供している間に、IISがそれを保持するのはその時です。 –

+0

IISディレクトリにもコピーするように設定されていることを確認してください( "ローカルコピー")。 DLLは、互いに同じ相対的な構造でなければなりません。コードは、不足しているDLLが見つからないほどスマートではありません。 –

+0

一般的な方法が含まれていない場合は問題ありません。アセンブリはGACにインストールされます。 –

2

編集2: これはあなたの問題を解決次のようになります。Strange Error - CS0012: The type x is defined in an assembly that is not referenced

しかし、本当説明理由。


編集:

あなたのアセンブリがGACにあるので、それはローカルコピーを必要とし、それを見つけていないする必要があります。

GACのバージョンが、探しているバージョンであることを確認してください。 Gacutilを使用して、GACの内容を確認できます。私のマシンでは、gacutil.exeは 'C:¥Program Files(x86)¥Microsoft SDKs¥Windows¥v10.0A¥bin¥NETFX 4.6.1 Tools'にありますが、マシン上の他の場所にある可能性があります。あなたがそれを見つけたら、コマンドラインからこれを実行する:あなたは、エラーメッセージに表示されるものと一致しなければなりませんます。gacutilによってMyDataModelAssembly

バージョンと公開キートークン出力

ます。gacutil /リットル。 MyDataModelClassを定義


、アセンブリDLLは、IISからアプリケーションを実行している場所にコピーされなければなりません。

[ローカルコピー]設定は、Visual Studioに、コンパイル出力パス(IISがアプリケーションを実行している場所)にDLLをコピーするように指示します。 GACにないアセンブリに対しては、ローカルコピーをtrueに設定する必要があります。

+0

このアセンブリはGACにあります。 –

+0

これはジェネリックメソッドが追加されたときにのみなぜ発生しますか?これはMyDataModelClassを参照するクラス内の唯一の場所ではありません。 –

+0

参照を使用するコードが実際に実行されるまで、エラーは発生しません。したがって、クラスを使用する他の場所が実行されていない可能性があります。 –

関連する問題