C# で記述されたユーザーのタスク バーにある UI アプリケーションがあります。ツールの EXE は、それを使用する多くのプロジェクトのソース管理システムにチェックインされているため、更新された EXE をチェックインすることで、実行するバージョンを更新できます。
問題は、ユーザーが exe の最新リビジョンを取得すると、プログラムが頻繁に実行され、マシンで同期が失敗することです。プログラムが実行時にexeと依存DLLをロックしないように修正して、プログラムをシャットダウンせずに同期できるようにします。
現在、実行可能ファイルをパラメーターとして受け取り、事前にアセンブリの内容をメモリに読み込んでメモリから起動するプログラムがあります。残念ながら、プログラムが必要とする DLL に関しては、これは完全に失敗します。
私が今持っているコードは次のようになります。
public class ExecuteFromMemory
{
public static void Main(string[] args)
{
//Figure out the name of the EXE to launch and the arguments to forward to it
string fileName = args[0];
string[] realArgs = new string[args.Length - 1];
Array.Copy(args, 1, realArgs, 0, args.Length - 1);
//Read the assembly from the disk
byte[] binary = File.ReadAllBytes(fileName);
//Execute the loaded assembly using reflection
Assembly memoryAssembly = null;
try
{
memoryAssembly = Assembly.Load(binary);
}
catch (Exception ex)
{
//Print error message and exit
}
MethodInfo method = memoryAssembly.EntryPoint;
if (method != null && method.IsStatic)
{
try
{
method.Invoke(null, new object[] { realArgs });
}
catch(Exception ex)
{
//Print error message and exit
}
}
else
{
//Print error message and exit
}
}
}
私の質問は、私はまったくばかげたことをしているのでしょうか? これを処理するより良い方法はありますか?そうでない場合、外部依存関係の処理をサポートするにはどうすればよいですか?
たとえば、上記のコードは、「Bar.dll」の関数を使用する「Foo.exe」を実行しようとすると、依存ファイルのロードに失敗します。「Foo.exe」は上書き可能になりますが、「Bar.dll」は依然としてロックされ、上書きできません。
ロードされたアセンブリの 'GetReferencedAssemblies()' メソッドから参照アセンブリのリストを取得しようとしましたが、アセンブリがどこからロードされるべきかを示すものではないようです...自分でそれらを検索する必要がありますか? もしそうなら、これを行う最善の方法は何ですか?
他の人が以前にこれに遭遇した可能性があるようで、私は車輪を再発明したくありません.
- 更新: EXE がチェックインされているのは、社内ツールを使用するチームに社内ツールを配布するためです。このユースケースには最適ではありませんが、そのポリシーを変更する機会はありません。