DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.resources ファイルが壊れています。

環境/言語:[Windows7、.NET Framework 3.5、VS2008]
分類:[その他]

かなり急ぎの為、マルチポストしています。
以下、マルチポスト先です。

http://social.msdn.microsoft.com/Forums/vstudio/ja-JP/a4b69aec-0cf7-4be0-91ba-77bbb06b6f33/windows-7vs2008?forum=csharpgeneralja
http://bbs.wankuma.com/index.cgi?mode=al2&namber=70762
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=17565

先日、XPのサポート終了の為、開発環境をWindows XPからWindows 7へ移行しました。

その際に、新たにClassを追加するとエラーが発生するようになりました。

エラーは以下です。


エラー 1 The "GenerateResource" task failed unexpectedly.
System.Runtime.InteropServices.ExternalException: GDI+ で汎用エラーが発生しました。
   場所 System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
   場所 System.Drawing.Image.Save(MemoryStream stream)
   場所 System.Drawing.Image.System.Runtime.Serialization.ISerializable.GetObjectData(SerializationInfo si, StreamingContext context)
   場所 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
   場所 System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter)
   場所 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   場所 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   場所 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)
   場所 System.Resources.ResourceWriter.WriteValue(ResourceTypeCode typeCode, Object value, BinaryWriter writer, IFormatter objFormatter)
   場所 System.Resources.ResourceWriter.Generate()
   場所 System.Resources.ResourceWriter.Dispose(Boolean disposing)
   場所 System.Resources.ResourceWriter.Close()
   場所 Microsoft.Build.Tasks.ProcessResourceFiles.WriteResources(IResourceWriter writer)
   場所 Microsoft.Build.Tasks.ProcessResourceFiles.WriteResources(String filename)
   場所 Microsoft.Build.Tasks.ProcessResourceFiles.ProcessFile(String inFile, String outFile)
   場所 Microsoft.Build.Tasks.ProcessResourceFiles.Run(TaskLoggingHelper log, ITaskItem[] assemblyFilesList, ArrayList inputs, ArrayList outputs, Boolean sourcePath, String language, String namespacename, String resourcesNamespace, String filename, String classname, Boolean publicClass)
   場所 Microsoft.Build.Tasks.ProcessResourceFiles.Run(TaskLoggingHelper log, ITaskItem[] assemblyFilesList, ArrayList inputs, ArrayList outputs, Boolean sourcePath, String language, String namespacename, String resourcesNamespace, String filename, String classname, Boolean publicClass)
   場所 Microsoft.Build.Tasks.GenerateResource.Execute()
   場所 Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult)
NS_client
上記のエラーは、もう一度デバッグを実行すると無視出来るようですが、

下記のコードを実行すると、

string version = NS_client.Properties.Resources.version;
Resources.versionへアクセスした時点で

.resources ファイルが壊れています。ResourceReader を読み取ろうとしているときに予期しない EndOfStreamException が発生しました。
のようなエラーが発生します。

Resourcesの総入れ替えを行いましたが、解決しません。
■No32270に返信(n_keiichiroさんの記事)

旧開発環境:WindowsXP、Visual Studio 2008 C# Framework 3.5

新開発環境:Windows7、Visual Studio 2008 C# Framework 3.5

旧開発環境で開発していた場合はエラーは発生しませんでした。
新開発環境にプロジェクトごとコピーして移動して、新しいClassを追加しただけでエラーが発生します。
新しいFormを追加しただけでも同様にエラーとなります。
また、一からプロジェクト新規作成し、既存のファイルを全て取り込んでも同様にエラーになります。

アプリは、旅行業で利用するシステムで、
SOAP通信でPHPと連動してデータベースとの送受信を行う感じです。
Windows7 64bit です。
>これは実行時エラーですか?
>それともビルドエラーですか?
>それともClass等を追加したタイミングで出るのでしょうか?
実行時エラーです。
resourcesを参照する部分で全てエラーが発生します。


>「総入れ替え」とはどのような手法・手順ですか?
>またリソースファイルに含まれている内容はどのような内容がありますか?
>(文字列・アイコン・イメージ・オーディオ・ファイル等)
プロジェクト→プロパティ→リソースを選択後、追加されているリソースを全て削除し、
別のフォルダに退避してあった同じファイルを全て追加です。
リソースの中身は、.gif、.png、.jpg、version.txt(アプリのバージョンの数値が入ってます。)


>OSは32ビットですか?64ビットですか?
>プロジェクトのターゲットCPUはx86ですか?x64ですか?AnyCPUですか?
Windows7 64bit です。
AnyCPUです。

>新プロジェクトを作成して当該リソースファイルを取り込んでから
>Class等を追加するとどうなりますか?
同様にエラーが発生します。
>関係ないかもだけど、GenerateResourceタスク
>http://msdn.microsoft.com/ja-jp/library/ms164295.aspx
>に「 MSBuild 4.0 を使用して .NET 3.5 プロジェクトをターゲットにしている場合、x86 リソースでビルド>が失敗することがあります。 この問題を回避するために、ターゲットを AnyCPU アセンブリとしてビ>ルドできます。 」
>という記述がありますね。
調査、ありがとうございます。

>Class等を追加しなければresourcesを参照する部分でも
>エラーは発生しないという事でしょうか?
はい、ClassやFormを追加しなければ、エラーが発生せず、実行出来ます。

>リソースファイル自体をExplorer等から完全に削除した状態から始めた場合はどうでしょうか?
>(邪魔している要素がもしあったらを極力排除したい。)
リソースを完全に削除後、ClassやFormを追加すると同様のエラーが発生します。

>元の環境(XP)は?
>AnyCPUというのは元の環境も新環境も変わらずという事ですよね?
元の環境(Windows XP)も同様に、、AnyCPUです。

>元の環境(XP)が32bitならば、
>元の環境(XP)でプロジェクトのターゲットCPUをAnyCPUからx86にしてから動作を確認した状態で
>新環境に持ってきた場合は?
同様にエラーが発生します。
別プロジェクトで開発していたシステムの場合は、ClassやFormを追加しても
なぜかエラーが発生しません。

>では新プロジェクトを作成して当該リソースファイルではなく、
>新プロジェクトに含まれているリソースファイルに対象の画像等を追加した場合は?
>(その際のターゲットCPUをAnyCPU・x86・x64全て)
同様にエラーが発生します。

自己解決したので、ご報告です。

新しいプロジェクトを作成し、リソースにアクセスするコード、

System.Reflection.Assembly asm;
asm = System.Reflection.Assembly.GetExecutingAssembly();
string version = NS_client.Properties.Resources.version;


のみ記載し、リソースのファイルを一つずつ追加していき、

追加するたびにコンパイルを実行して確認したら、原因の画像が見つかりました。
「seal.png」という名称の画像で、

大きさ 95 x 100
幅 95ピクセル
高さ 100ピクセル
ビットの深さ 24

のようなプロパティです。

ご返答頂いた方々、ありがとうございました。
解決済み!
追記です。

> ⇒存在しない場合、一番近くてどのようなプロパティか?
近い画像は、
サイズ:20.1KB(20,645バイト)
ディスク上のサイズ:24.0KB(24,576バイト)

エラーの出た画像は、
サイズ:20.2KB(20,764バイト)
ディスク上のサイズ:24.0KB(24,576バイト)

> ⇒他と明らかに違う条件はあるか?(サイズが大きすぎる等)
画像サイズは上記の通り、かなり小さいサイズです。

確かXPで開発していた時に、エラーの出るこの画像の生成の仕方が、
PDF上の画像をPrintScreenでコピーし、XP上のペイントに貼り付けて、
PNGとして保存した感じです。
原因はこれでしょうか??そんなバカなww
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板