0

私は、ユーザーがc#コードを動的にコンパイルできるようにするac#codedomプロジェクトに取り組んでいます。wpfのアセンブリdllを追加するとエラーが発生します(winformsでは正常に機能しています)。「System.Windows.Media」のような参照を追加しようとすると、「アセンブリで####が見つかりません。参照がありませんか」と表示されます。しかし、「C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll」のようなdllパスで参照を追加すると、「File C:\ Program Files\Reference」と表示されます。 Assemblies \ Microsoft \ Framework \ v3.0 \ System.Printing.dll not found」ですが、System.Printing.dllをアプリケーションの実行可能フォルダーに配置すると正常に動作します。

以下は、コンパイラオプションへの参照を追加するために使用しているコードです。

CompilerParameters oParameters;
:
:
:
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll";
oParameters.ReferencedAssemblies.Add(lcAssemblyDll);

私は問題を理解することができません。また、wpfアセンブリを追加する他のアプローチはありますか?

ありがとう

4

1 に答える 1

1

まあ、私は頭の中で完全な答えを提供することはできませんが、まず最初に、コンパイル参照はアプリケーションの実行中にアセンブリを解決できることと同じではないことを理解する必要があります。したがって、アプリケーションの実行中にそのエラーが発生した場合、タイプローダーの例外がスローされることが想像できます。

次に、依存しているクラスの基本タイプがSystem.Windows.Mediaが参照しているアセンブリに存在するため、「アセンブリに####が見つかりません。参照がありません」というメッセージが表示される可能性があります。

参照するアセンブリのAssembly.ReflectionOnlyLoad中にロードされるアセンブリへの参照を追加して、この問題を解決することができます。AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolveのイベントハンドラーを追加すると、それらのアセンブリが読み込まれることを確認するコードを追加してから、CodeCompileUnitへの参照を追加するだけで済みます。

私はこれで1つの問題に遭遇しました、そしてそれはコンパイル中にいくつかの参照が最適化されるということでした、それで私はそれらのアセンブリのそれぞれで見つかった最初の構築可能な型を初期化するCodeCompileUnitにコンテナクラスを単に追加する厄介なハックを実装しました。

それが少し役立つことを願っています。

于 2010-11-16T06:41:27.950 に答える