Итак, я использую некоторое отражение для вызова функции из библиотеки 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 ответа
Думаю, я знаком с этой компанией и ее продуктами. Это неуправляемая 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.
Я предполагаю, что .net не может разрешить ссылку на сборку. Присоединитесь к событию AssemblyResolve домена приложения и загрузите сборку по правильному пути: http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve (v = VS.90) .aspx
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetDllDirectory(string dllPath);
SetDllDirectory (@ "G: \ Remote \ Debug \");
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.