Не удалось загрузить файл или сборку SharpDX

Я использую easyhook и SharpDX для получения данных о частоте кадров в игре DirectX. Иногда это работает. Однако, когда я запускаю его в следующий раз (может быть, всего через несколько минут), он выдает исключение System.IO.FileNotFoundException: Could not load file or assembly SharpDX.

Когда я перезапускаю его несколько раз, он может работать. Почему? У кого-нибудь есть такие же проблемы, как у меня?

Версия SharpDX: 2.4.2


person Vincent Wong    schedule 10.01.2014    source источник
comment
Как выглядит ваш инъекционный вызов EasyHook? В прошлом я также использовал ILMerge для объединения SharpDX, EasyHook и моих сборок в одну.   -  person Justin Stenning    schedule 15.02.2014


Ответы (1)


Я не использую EasyHook, но следующий код должен работать и у вас. Вместо использования ILMerge, который имеет некоторые ограничения, сделайте следующее:

1) Привяжите подписанную копию SharpDx.dll и все остальные необходимые сборки SharpDx к вашему проекту. Установите для свойства «Локальная копия» значение «Ложь».

2) Добавьте эти библиотеки в свой проект (как и в случае с файлами .cs) и установите для свойств файлов значения «Встроенный ресурс» и «Не копировать в выходную папку». Убедитесь, что эти файлы точно такие же, как вы связали на шаге 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;
         }
     };
 }
person user1431279    schedule 28.02.2014