C#으로 작성된 사용자 작업 표시 줄에있는 UI 응용 프로그램이 있습니다. 도구에 대한 EXE는이를 사용하는 여러 프로젝트에서 소스 제어 시스템에 체크인되므로 업데이트 된 EXE를 체크인하여 실행 버전을 업데이트 할 수 있습니다.C#의 메모리에서 프로그램을 시작하려면 어떻게해야합니까?
문제는 사용자가 최신 버전의 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 '은 여전히 잠겨 있으며 덮어 쓸 수 없습니다.
로드 된 assmebly의 'GetReferencedAssemblies()'메소드에서 참조 된 어셈블리 목록을 가져 오려고했으나 어셈블리를로드해야하는 위치를 알려주지 않는 것으로 보입니다. 검색해야합니까? 그들 자신을 위해서? 그렇다면이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
다른 사람들이 전에이 문제를 경험 한 것 같아서 바퀴를 다시 발명하고 싶지 않습니다.
- 업데이트 : EXE는 우리가 사내 도구를 사용하는 팀에 사내 도구를 배포하는 방식으로 인해 체크 인됩니다. 이 유스 케이스에는 최적이 아니지만 그 정책을 변경할 기회가 없다.
왜 메모리에서 실행 하시겠습니까? 이것은 프로그램을 라이브 바이러스처럼 보이게하는 좋은 방법입니다. – Migol