6

.NET 2.0 を使用しています。

System.Drawingは私の参照リストにあります。

これが私のusing声明です:

using System.Drawing;

コードは次のとおりです。

private static Rectangle rScreen;

この行のエラーは次のとおりです。

エラー テキスト: タイプまたは名前空間名 'Rectangle' が名前空間 'System.Drawing' に存在しません (アセンブリ参照がありませんか?)

なんで?

編集: コンパイル コードを追加:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("CompilerVersion", "v3.5");

CSharpCodeProvider codeProvider = new CSharpCodeProvider(dict);

CompilerParameters parameters = new CompilerParameters();

{
    parameters.ReferencedAssemblies.Add("System.Drawing.dll");

    parameters.ReferencedAssemblies.Add("System.dll");

    parameters.ReferencedAssemblies.Add("System.Core.dll");

    parameters.ReferencedAssemblies.Add("System.Data.dll");

    parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");

    parameters.ReferencedAssemblies.Add("System.DirectoryServices.dll");

    parameters.ReferencedAssemblies.Add("System.Configuration.dll");

    parameters.ReferencedAssemblies.Add("System.Web.dll");

    parameters.ReferencedAssemblies.Add("System.Xml.dll");

    parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

    parameters.ReferencedAssemblies.Add("System.Web.Services.dll");

    parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");

    parameters.ReferencedAssemblies.Add("System.IdentityModel.dll");

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.Common.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.WebForms.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));
}

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sources.ToArray());

try
{
    ApexAssemblyManager.dynamicAssemblies.Add(hashKey, new DynamicAssemlby(results.CompiledAssembly));

    return ApexAssemblyManager.dynamicAssemblies[hashKey].CreateInstance(typeName);
}

他のすべての ReferencedAssemblies は機能し、長い間機能しています。こんなエラーは初めてです。

参照が追加されていることを確認し、再確認しました。プロジェクトに再度追加しようとすると、参照が既に存在するというメッセージが表示されます。

ありがとう

4

1 に答える 1

5

コメントとタグで、これが別のアプリケーションによって動的にコンパイルされていることを示します。したがって、この他のアプリケーションはSystem.Drawing.dll、コンパイルの実行時に参照としてインクルードされていない可能性が高く、そのため、型は解決されません。単に宣言するだけでは十分ではなくusing System.Drawing、その名前空間とその型を定義するアセンブリもコンパイラに渡す必要があります。

コードでは、これは、コンパイルを実行しているインスタンス (この場合は)への呼び出しCompilerParametersの 1 つを介して渡されたインスタンスを使用して行われます。コレクションは、型解決を実行しようとするときにどのアセンブリを参照するかをコンパイラに示します。CompileAssemblyFrom...CodeDomProviderCSharpCodeProviderCompilerParameters.ReferencedAssemblies

更新
参照 に明示的に追加mscorlibしてみてください。

また、これが関連しているかどうかはわかりませんが、サーバーについて言及したように (それは何らかのサービスですか?)、MSDN は次のように述べています

System.Drawing 名前空間内のクラスは、Windows または ASP.NET サービス内での使用はサポートされていません。これらのアプリケーション タイプのいずれかからこれらのクラスを使用しようとすると、サービス パフォーマンスの低下やランタイム例外など、予期しない問題が発生する可能性があります。サポートされている代替手段については、「Windows イメージング コンポーネント」を参照してください。

これは予期しない問題であると言えますが、コンパイル プロセスではなく、コードの実行時に問題が発生するとは考えていません。とはいえ、ドキュメントでは実際には指定されていないためSystem.Drawing.dll、一般的な参照としての使用に適用できます。

于 2011-05-16T18:06:59.513 に答える