2011-09-30 40 views
5

私はコンパイルしたプログラムが使用するアセンブリのみを参照するコードに対して、CompileAssemblyFromSourceを使用しています。それは美しく動作します。C#CompileAssemblyFromSource、必要な参照アセンブリを追加しますか?

しかし、「blah;を使用する」コードをコンパイルする必要がある場合は、声明を見つけることができず、リソースが不足していると言います。

"System.Windows.Forms"の場合は、 "compilerparams.ReferencedAssemblies.Add(" System.Windows.Forms.dll ")"と表示されます。

コードファイルを解析してすべての「使用」パラメータを取得できますが、それらが「* .dll」の追加になっていることを知っているか、別の場所やその他の名前空間になっていますか? .NETが "System.Windows.Forms"を取り込み、 "System.Windows.Forms.dll"を吐き出す方法はありますか?

+0

に辞書からアセンブリの参照を追加してみてくださいコードをコンパイルすることができないように、あなたが使用するクラス名と名前空間とまったく同じDLLを作成することができます。この問題を解決するには、同じ方法でソースコードとともに参照として含めるバイナリ(サテライトアセンブリ)を提供する必要があります。Visual Studioには、ハッシュを含む参照が保持されます。 –

+0

'Assembly.GetAssembly(typeof (MyType)) '??単一の名前空間は@ArturMustafinごとに複数のアセンブリから来る可能性があるので、使用するステートメントだけでなく、実際に使用されている型を知る必要があります。 – mellamokb

+0

@mellamokb:コードは、次のようになります: 'Assembly.GetAssembly(typeof(MyType) ) 'の場合、' MyType'型はコンパイル時に知られていることを意味します( 'typeof'文での使用に必要です)。コード自体またはコンパイル中のソースのいずれかです。あなたの場合は、AppDomain.AssemblyResolveイベントハンドラの解決方法を提供して、アセンブリの検索とダウンロードを行う必要があります。しかし、とにかく言われているように、問題を解決するためにソースコードだけに頼ることはできません –

答えて

1
  1. コードのロードに1つの
  2. ロードすべてのアセンブリ内のすべての種類の点で述べた場所で見つかったすべてのアセンブリをコンパイルする前に記事How the Runtime Locates Assemblies
  3. を読み、名前空間、タイプのペアの辞書を保つ
  4. 使用して、ソースで遭遇した場合、名前空間は、ACRを起動することができますので、あなたのクラスが含まれていますどのようなアセンブリを見つける方法はありません3
関連する問題