web-dev-qa-db-ja.com

.Net 2.0、VS2010およびWindows 8で「ファイルまたはアセンブリSystem.Drawingまたはその依存関係の1つをロードできませんでした」エラー

WindowsフォームアプリケーションプロジェクトでFileNotFoundExceptionが発生し、次のメッセージが表示されます。

_Could not load file or Assembly 'System.Drawing, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. 
The system cannot find the file specified.
_

問題を再現するには:

  • [新規]、[プロジェクト]の順に選択し、.Net Framework 2.0をターゲットとして選択し、プロジェクトの種類として[Windowsフォームアプリケーション]を選択します。
  • デフォルトで作成されたフォームのプロパティで、Iconプロパティの値を選択します。すべての.icoファイルで十分です。これにより、resxファイルにファイルが埋め込まれます。
  • アプリケーションをコンパイルして実行します。

これを行うと、プログラムはthis.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));の行で停止しますが、次の例外があります。

_System.IO.FileNotFoundException was unhandled
  Message=Could not load file or Assembly 'System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
  Source=mscorlib
  FileName=System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
_

これはVisual Studio 2010 SP1で入手できます。最近Windows 8 Developer Previewにインストールされました。プロジェクトのプロパティを変更して.Net Framework 4をターゲットにすると、エラーはなくなります。

Form1.resxファイルで、System.Drawing Assemblyのバージョンが2.0と明示されていることがわかります。

_<Assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
_

何か案は?

16
Leonardo

私は可能な解決策を見つけました、これを試してください:

デザイナーでresxファイルを開き、accessmodifierをpublicからno code generationに設定します。

編集:回避策がありますが、非常に迷惑です。

  1. Designerでフォームを開き、必要なGUIの変更を行います。デザイナーを閉じて保存
  2. プロジェクトをコンパイルし、RESXコンパイルエラーを受け取ります(Imagelistのあるフォームのみがこの問題を抱えているはずです)
  3. Resxコンパイルエラーをダブルクリックして、resxファイルを開きます。
  4. 画像ストリームの一番上までスクロールします。
  5. イメージストリームの一番上の行を編集します。
  6. Resxファイルを閉じて保存し、再コンパイルします。

**注:唯一の違いは、末尾の文字「j00LjAuMC4w」から「j0yLjAuMC4w」までです。これは、フォームをデザイナーモードで開くたびに実行する必要があります。

Microsoftは次のVSバージョンで修正する予定だと言っています...

ソース: http://connect.Microsoft.com/VisualStudio/feedback/details/532584/error-when-compiling-resx-file-seems-related-to-beta2-bug-525202

4
vulkanino

これはバグです。私も見ました。これは、.resxファイルが、存在しないSystem.Drawingの4.0.0.0バージョンを指しているために発生します。この問題を解決するには、通常、メモ帳で.resxを編集して4.0.0.0を2.0.0.0に変更します。バグは、あなたが概説した正確な手順に従って導入されます。

9

この問題は、.net 4.5プレビューリソースがリソースファイルの作成に使用されている場合に発生する可能性があります。

私のラップトップ(Windows 7、VS2010 Premium、VS11 Developer Preview)にも同じ問題があります。フォームで 'localizable = true'と言うと、単純なフォームプロジェクトでこの問題が発生しました。私の場合、画像データは含まれていません。プロジェクトは.net 3.5に設定されています

_private void InitializeComponent()
{
    System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
    this.SuspendLayout();
    // 
    // Form1
    // 
    resources.ApplyResources(this, "$this"); //exception Could not load file or Assembly 'System.Drawing, Version=4.0.0.0, 
_

このプロジェクトを別のマシン(Windows 7、VS2010 Premium)にコピーしてデバッグしようとすると、エラーが残ります。ソリューション(プロジェクトではなく)をクリーンアップすると(またはbin/objを手動で削除すると)エラーはなくなります。このソリューションをラップトップにコピーして戻すと、エラーはなくなりましたが、デザインビューでフォームを再び表示できません。 'Error message: at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)'

これらすべての理由は、*。Designer.csファイルの.netバージョンにあるようです。

  1. ランタイムバージョン:4.0.30319.239動作するコンピューター上で、
  2. ランタイムバージョン:4.0.30319.1702例外が発生するラップトップ上。

誰かが.net 3.5プロジェクトを扱うときに使用されるresgenバージョンをどこで設定できるか教えてもらえますか?

5
Manuel

私はこの問題を抱えており、奇妙なことに.Net 4.5ベータに関係していることがわかりました。それをアンインストールし、.Net 4.0を再インストールすると、問題は解消しました。 .Net 4.5ベータ版をインストールする方法があるかどうかわからないand .Net 2.0プロジェクトのリソースを同時に使用する。

1
Dax Fohl

同じ問題がありました。

.net 4.5.1を修復して修正しました。

1
Jon

私は同じ問題に遭遇し、上記の提案のどれも私にとってうまくいかなかったので、私は次のことをしました:

プロジェクトを開く
ソリューションエクスプローラーに移動します
参照グループを展開する
System.Drawing参照を削除します
参照グループを右クリック
参照を追加
「。NET」タブで、System.Drawingを検索して正しい参照を追加します

0
NG.

ここに私のために働いた簡単な解決策があります:

同じエラーが発生しました。私のコードは、VS2017を使用したEMGUパッケージFeatureMatchingの例です。

エラーは、System.Drawing.dllのバージョンとターゲットフレームワークの不一致から発生しているようです。

これを修正するために、System.Drawingを削除しました(ソリューションエクスプローラーの[参照]で右クリックします)。次に、[参照の追加]をクリックし(ソリューションエクスプローラーで[参照]を右クリック)、次のフォルダーを参照します:C:\ Windows\Microsoft.NET\Framework \

その中には、v1.xxxx、v2.xxxx、v3.xxxxなどのラベルが付いたフォルダーがあります。私はv4.0.30319フォルダーを開き、その中のSystem.Drawing.dllファイルを選択しました。 OKをクリックします。

次に、ターゲットフレームワークを設定するために移動しました。メニュー>プロジェクト> YourAppプロパティ(メニューの下部)に移動します。左側の[アプリケーション]を選択します。 「ターゲットフレームワーク」のドロップダウンがあります。 .NET Framework 4 "を選択しました。何かがなくなったことについて恐ろしいことを伝えるメッセージが表示され、プロジェクトを閉じて再度開きます。[OK]をクリックすると、プロジェクトはすぐに閉じて再び開きます。

私は自分のプロジェクトを実行しましたが、今では問題ありません。

0
DanG

私もこの問題を経験しましたが、私の場合、2つの本質的に重複するプロジェクトを並行してビルドしたことが原因です。タイミングが適切であれば、2.0プロジェクトは4.0プロジェクトから出力ファイルを取得し、4.0ライブラリを参照することになります。

プロジェクトを連続して構築し、一方を他方に依存させることで修正しました。

(これがおそらく@Leonardoによって投稿された元の問題の原因ではなかったことに感謝しますが、同様のデュアルプロジェクトセットアップでこのエラーが発生する将来の訪問者にとって役立つかもしれません。)

0
RichieHindle

同じ問題がありました。私のフレームワーク2.0プロジェクトでは4.0 dllを参照し続けます。私がそれを修正することができた方法...プロジェクト参照に移動する->「Syste.Drawing」を選択する->プロパティを選択し、そこからuse exact version = trueを選択する

これにより、2.0フレームワークdllが強制的に使用されます。

お役に立てれば。

乾杯!!!

0
user4784388

最近、顧客からアプリケーションのダウングレードを要求されたときに同じエラーメッセージが表示されました。

Visual Studio 2010 Professionalを使用して、ターゲットフレームワークを.NET Framework 4から.NET Framework 3.5に変更しました。その後、ビルドは指定されたエラーメッセージで失敗しました。解決策は、問題を引き起こしているイメージファイルをアプリケーションリソースから削除することでした。再度追加すると、System.Drawingのバージョンは2.0.0.0と表示され、ビルドは成功しました。

0
Journeyman

これはOPの状況には関係ありませんが、ResourceWriterクラスを使用して.resxファイルを.resourcesファイルに変換する際にこのエラーが発生する場合は、オン。私はこのエラーに遭遇し、修正するために見つけた唯一の方法は、"System.Drawing, Version=4.0.0.0"のデータをスキャンして"System.Drawing, Version=2.0.0.0"で置き換えることでした。これが私のコードです(これはRoslynの変更の一部です):

  /// <summary>
  /// Method that gets called by ManagedResource.WriteData() in project CodeAnalysis during code 
  /// emitting to get the data for an embedded .resx file. Caller guarantees that the returned
  /// MemoryStream object gets disposed.
  /// </summary>
  /// <param name="resourceFullFilename">full path and filename for .resx file to embed</param>
  /// <param name="targetLessThan4">true if necessary to change System.Drawing from 4.0.0.0 to 2.0.0.0</param>
  /// <returns>MemoryStream containing .resources file data for the .resx file</returns>
  [SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]
  private static MemoryStream ProvideResourceDataForResx(string resourceFullFilename, 
                                                         bool targetLessThan4)
  {
     MemoryStream shortLivedBackingStream = new MemoryStream();
     using (ResourceWriter resourceWriter = new ResourceWriter(shortLivedBackingStream))
     {
        using (ResXResourceReader resourceReader = new ResXResourceReader(resourceFullFilename))
        {
           IDictionaryEnumerator dictionaryEnumerator = resourceReader.GetEnumerator();
           while (dictionaryEnumerator.MoveNext())
           {
              string resourceKey = dictionaryEnumerator.Key as string;
              if (resourceKey != null)  // Should not be possible
                 resourceWriter.AddResource(resourceKey, dictionaryEnumerator.Value);
           }
        }
     }

     // Get reference to the buffer used by shortLivedBackingStream, which is now closed because
     //  resourceWriter was disposed. If relevant, fix version number for System.Drawing.
     byte[] backingStreamBuffer = shortLivedBackingStream.GetBuffer();
     if (targetLessThan4)
        ChangeSystemDrawingVersionNumber(backingStreamBuffer);

     // Create new MemoryStream because shortLivedBackingStream is closed
     return new MemoryStream(backingStreamBuffer);
  }


  /// <summary>
  /// Method to change the System.Drawing version number from "4.0.0.0" to "2.0.0.0" in the
  /// binary data that represents a .resources file. This implementation is based on the
  /// assumption that character data in the .resources file is in UTF-8 encoding.
  /// </summary>
  private static void ChangeSystemDrawingVersionNumber(byte[] dataBuffer)
  {
     byte[] byteArray1 = Encoding.UTF8.GetBytes("System.Drawing, Version=4.0.0.0");
     byte[] byteArray2 = Encoding.UTF8.GetBytes("System.Drawing, Version=2.0.0.0");

     for (int i = 0; i < dataBuffer.Length - byteArray1.Length; i++)
        if (ArrayEquals(byteArray1, dataBuffer, i))
           Array.Copy(byteArray2, 0, dataBuffer, i, byteArray2.Length);
  }


  /// <summary>
  /// Method to test for a byte array in a larger byte array that is being searched. No error
  /// checking is done - it's assumed an indexing error is not possible.
  /// </summary>
  private static bool ArrayEquals(byte[] searchArray, byte[] searchedArray, 
                                  int searchedArrayIndex)
  {
     for (int i = 0; i < searchArray.Length; i++)
        if (searchArray[i] != searchedArray[searchedArrayIndex + i])
           return false;
     return true;
  }

編集:この回答の以前のバージョンでは、ResourceWriter.TypeNameConverterメソッドを使用しました。これは一部の状況では機能しましたが、他の状況では機能しませんでした。また、少なくとも.Net Coreの対応するコードについて、そのコードに問題がある可能性があることを示すバグレポートがあります。 https://github.com/dotnet/corefx/issues/1108

0
RenniePet

Xamarin Projectで同じ問題に遭遇しました

これはWindows dllであるため、Xamarinでは実際には機能しません。

議論を見て、

https://forums.xamarin.com/discussion/14340/adding-a-reference-to-net-Assembly

0
Gobi M