Использование рефлексии для вызова DLL, но другая необходимая DLL вызывает исключение - PullRequest
2 голосов
/ 10 ноября 2010

Так что я использую некоторые отражения для вызова функции из DLL на сетевом диске. Проблема в том, что dll требует другого dll, и он находится в той же папке, но выдается исключение.

Вот мой код:

 try
        {
            Assembly loadedDLL = Assembly.LoadFrom(@"G:\Remote\Debug\BonderControlPanelSim.dll", AppDomain.CurrentDomain.Evidence);
            Type rtsObj = loadedDLL.GetType("Oe.Te.Ranorex.Instrument.BonderControlPanelSim");
            Object obj = Activator.CreateInstance(rtsObj);

            rtsObj.InvokeMember("Initialize", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj, new object[] { "COM3", 1, 2 });
            Thread.Sleep(1500);
            rtsObj.InvokeMember("PushStart", BindingFlags.InvokeMethod | BindingFlags.Public, null, obj, new object[] { "3" });
            Thread.Sleep(200);
            rtsObj.InvokeMember("Shutdown", BindingFlags.InvokeMethod | BindingFlags.Public, null, obj, null);

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

Исключение, которое я получаю, это:

{"Невозможно загрузить DLL 'SeaMAX.dll': указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)"}

SeaMAX.dll требуется с BonderControlPanelSim.dll.

Моя проблема в том, что dll находится в той же папке ... но моя dll, когда отражение используется для вызова члена, не может найти dll ... но она там. Я что-то упустил

Ответы [ 3 ]

4 голосов
/ 10 ноября 2010

Мне кажется, я знаком с этой компанией и ее продуктами. Это неуправляемая DLL, используемая для промышленного ввода-вывода. Проблема в том, что Windows не может найти зависимость, она не разрешается загрузчиком CLR. Вы можете помочь, изменив текущий каталог:

string oldPath = Environment.CurrentDirectory;
Environment.CurrentDirectory = @"G:\Remote\Debug";
Assembly loadedDLL = Assembly.LoadFrom(...);
Environment.CurrentDirectory = oldPath;
// etc..

Предполагается, что seamax.dll находится в том же каталоге, что и сборка. Обычно это не так. Pinvoking SetDllDirectory () - это еще одна хитрость, как и копирование этой DLL в каталог, который находится в переменной среды PATH.

1 голос
/ 10 ноября 2010

Я предполагаю, что .net не может разрешить ссылку на сборку.Присоедините к событию AssemblyResolve AppDomain и загрузите сборку по правильному пути: http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v=VS.90).aspx

0 голосов
/ 11 ноября 2010
  [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string dllPath);

SetDllDirectory (@ "G: \ Remote \ Debug \");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...