3

簡単に言うと、Windowsフォームアプリケーションプロジェクトとクラスライブラリの両方をC#で構成するソリューションがあります。私の図書館プロジェクトはと名付けられましOldNameた。したがって、名前空間もOldNameであり、生成されたファイルはでしたOldName.dll

名前を変更したかったので、[プロパティ]に移動し、アセンブリ名をからOldNameに変更しましたNewName

ビルドすると、が生成されNewName.dllます。ただし、アプリケーションがこのdllにアクセスしようとすると、次のようになりますSystem.Runtime.Serialization.SerializationException(dllにはいくつかのものをバイナリシリアル化するためのメソッドが含まれています):Unable to find assembly 'OldName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.Procmon.exeが古いdllを探していることを確認すると主張します(NAME NOT FOUND)。

奇妙なことに、をコピーしNewName.dllて名前をに変更すると、とがあり、問題が解決しOldName.dllません。を削除してそのままにしておくと、起動時にプログラムが次のようにクラッシュします。今回、Procmon.exeは、で操作に失敗したと報告しますが、で同じことが発生するようです。OldName.dllNewName.dllNewName.dllOldName.dllSystem.IO.FileNotFoundException: Could not load file or assembly 'NewName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.CreateFileMappingOldName.dllFILE LOCKED WITH ONLY READERSNewName.dll

アセンブリ名を元に戻してOldNameすべてを修正しますが、もちろんファイル名はOldNameになり、それは望ましくありません。

私は一生の間、それが古いアセンブリ名を参照している他の場所を理解することはできません。何が欠けている可能性がありますか?

解決策:私のプログラムでは、ユーザーがファイルを作成し、dllのメソッドでシリアル化を使用してファイルをディスクに保存できます。また、ファイルをロードすることもできます。怠け者だったので、一度テストファイルを作って再利用しました。@Tigranが示唆したように、古いアセンブリ名はシリアル化されたデータファイル内にまだ表示されていたため、プログラムからロードしようとすると、シリアル化されたファイルで参照されているアセンブリが見つからなかったため、例外が発生していました。

4

1 に答える 1

5

あなたのプログラムではstandart .NET serialization. その種のシリアル化では、型情報.NETも保存されることに注意してください。名前空間を含む完全な型情報。つまり、アセンブリ名を変更して再コンパイルすると、完全な型名が一致しなくなります。

これがあなたがしていることではない場合は、明確にしてください。

于 2012-04-07T13:20:14.977 に答える