c#codedomコンパイラパラメーターにDLLからアセンブリを追加するエラー
-
10-10-2019 - |
質問
私は、ユーザーがC#コードを動的にコンパイルすることをユーザーに提供するAC#Codedomプロジェクトに取り組んでいます。 WPFのアセンブリDLLを追加するとエラーが発生しています(WinFormsの場合は正常に動作しています)。 「System.Windows.Media」などの参照を追加しようとすると、「アセンブリで####を見つけることができません。参照がありませんか」と言っています。しかし、「C: Program Files Reference Assemblies Microsoft Framework V3.0 System.Printing.dll」などのDLLパスで参照を追加すると、「ファイルC:プログラムファイル参照」と言っています。 assemblies microsoft framework v3.0 system.printing.dllは見つかりません。しかし、system.printing.dllをアプリケーション実行可能フォルダーに配置すると、正常に動作します。
以下は、コンパイラオプションへの参照を追加するために使用しているコードです。
CompilerParameters oParameters;
:
:
:
string lcAssemblyDll="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.Printing.dll";
oParameters.ReferencedAssemblies.Add(lcAssemblyDll);
私は問題を理解することができません。また、WPFアセンブリを追加する他のアプローチはありますか?
ありがとう
解決
まあ、私は頭の上から徹底的な答えを提供することはできませんが、まず第一に、コンピレーションリファレンスがアプリケーションの実行中にアセンブリを解決できるのと同じではないことを認識する必要があります。そのため、アプリケーションの実行中にそのエラーが与えられた場合、タイプレーダーの例外を投げることを想像できます。
次に、おそらく「アセンブリで####を見つけることができません。参照がありませんか?」を取得します。
アセンブリ中にロードされるアセンブリへのこの追加参照を解決してみてください。 appdomain.currentdomain.ReflectionOnlyAssemblyResolveのイベントハンドラーを追加すると、それらのアセンブリがロードされることを確認して、CodeCompileUnitに参照を追加するコードを追加できます。
私はこれで1つの問題に遭遇しましたが、それはいくつかの参照がコンピレーション中に最適化されることでした。そのため、それらの各アセンブリで見つかった最初の構成可能なタイプを初期化するCodeCompileUnitにコンテナクラスを追加する厄介なハックを実装しました。
それが少し役立つことを願っています。