2014-01-10 4 views
1

easyhookSharpDX을 사용하여 DirectX 게임에서 fps 데이터를 가져옵니다. 때로는 효과가 있습니다. 그러나 다음에 (아마 몇 분 후에) 시작하면 예외 System.IO.FileNotFoundException: Could not load file or assembly SharpDX이 발생합니다.파일 또는 어셈블리를로드 할 수 없습니다. SharpDX

여러 번 다시 시작하면 작동 할 수 있습니다. 왜? 누구도 내 문제와 동일한 문제가 있습니까?

SharpDX 버전 : 2.4.2

+0

EasyHook 인젝션 콜은 어떻게 생겼습니까? 과거에는 ILMerge를 사용하여 SharpDX, EasyHook 및 내 어셈블리를 하나로 결합했습니다. –

답변

0

나는 EasyHook를 사용하지 않지만, 다음과 같은 코드가 너무 당신을 위해 작동합니다. 몇 가지 제한이있는 ILMerge를 사용하는 대신 다음을 수행하십시오.

1) SharpDx.dll의 서명 된 copiy 및 다른 모든 필요한 SharpDx 어셈블리를 프로젝트에 연결하십시오. "Local Copy"속성을 "False"로 설정하십시오.

2) 프로젝트에 이러한 라이브러리를 추가하고 (.cs 파일 에서처럼) 파일의 속성을 "Embedded Resource"및 "출력 폴더에 복사하지 않음"으로 설정합니다. 해당 파일이 1 단계에서 링크 된 것과 정확히 일치하는지 확인하십시오.

3) 주입 후, 발견 된 경우 자원에서 임의의 어셈블리 (관리되는 또는 관리되지 않는)를로드하는 엔트리 포인트에서 다음 함수를 먼저 호출하십시오.

private static void LoadAssemblyFromResources() { 
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { 
     try { 
      Assembly asm = Assembly.GetExecutingAssembly(); 
      string name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll"; 
      string rsc = asm.GetManifestResourceNames().FirstOrDefault(s => s.EndsWith(name)); 
      if (rsc == null) return null; //assembly not found in resources 
      byte[] module; 
      using (Stream stream = asm.GetManifestResourceStream(rsc)) { 
       if (stream == null) return null; 
       module = new byte[stream.Length]; 
       stream.Read(module, 0, module.Length); 
      } 
      try { 
       return Assembly.Load(module); //Load managed assembly as byte array 
      } catch (FileLoadException) { 
       string file = Path.Combine(Path.GetTempPath(), name); 
       if (!File.Exists(file) || !module.SequenceEqual(File.ReadAllBytes(file))) 
        File.WriteAllBytes(file, module); 
       return Assembly.LoadFile(file); //Load unmanaged assembly as file 
      } 
     } catch { 
      return null; 
     } 
    }; 
}