簡単に言うと、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.dll
NewName.dll
NewName.dll
OldName.dll
System.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.
CreateFileMapping
OldName.dll
FILE LOCKED WITH ONLY READERS
NewName.dll
アセンブリ名を元に戻してOldName
すべてを修正しますが、もちろんファイル名はOldName
になり、それは望ましくありません。
私は一生の間、それが古いアセンブリ名を参照している他の場所を理解することはできません。何が欠けている可能性がありますか?
解決策:私のプログラムでは、ユーザーがファイルを作成し、dllのメソッドでシリアル化を使用してファイルをディスクに保存できます。また、ファイルをロードすることもできます。怠け者だったので、一度テストファイルを作って再利用しました。@Tigranが示唆したように、古いアセンブリ名はシリアル化されたデータファイル内にまだ表示されていたため、プログラムからロードしようとすると、シリアル化されたファイルで参照されているアセンブリが見つからなかったため、例外が発生していました。