Итак, я использую некоторое отражение для вызова функции из библиотеки 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 ... но она там. Я что-то упускаю

2
Sean P 10 Ноя 2010 в 20:28
1
Итак, ваша проблема ??? Похоже, он не может найти SeaMAX.dll. Может ли SeaMAX.dll где-нибудь найти его .NET?
 – 
Pieter van Ginkel
10 Ноя 2010 в 20:34
Да, я обновил свой вопрос, но SeaMAX.dll находится в том же месте, что и BonderControlPanelSim.dll, а BonderControlPanelSim.dll использует SeaMAX dll.
 – 
Sean P
10 Ноя 2010 в 20:51

3 ответа

Лучший ответ

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

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

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

4
Hans Passant 10 Ноя 2010 в 22:38
Думаю, мы здесь на правильном пути. И да, это неуправляемый .. Однако решение не сработало.
 – 
Sean P
11 Ноя 2010 в 02:09
1
Это было покрыто фразой «обычно это не так». Ты намного ближе к этой машине, чем я. Прочтите оставшуюся часть сообщения.
 – 
Hans Passant
11 Ноя 2010 в 02:11
Можете ли вы добавить к этой другой теме, которая у меня есть? stackoverflow.com/questions/4157620 /…
 – 
Sean P
11 Ноя 2010 в 21:30

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

1
madaboutcode 10 Ноя 2010 в 21:18
  [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string dllPath);

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

0
Sean P 11 Ноя 2010 в 03:06