【问题标题】:Using reflection to call a DLL but another DLL required is throwing an exception使用反射调用 DLL 但需要另一个 DLL 会引发异常
【发布时间】:2011-05-08 00:39:44
【问题描述】:

所以我使用一些反射从网络驱动器上的 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)”}

BonderControlPanelSim.dll 需要 SeaMAX.dll。

我的问题是 dll 在同一个文件夹中......但是当我使用反射调用成员时,我的 dll 找不到 dll......但它在那里。我错过了什么

【问题讨论】:

  • 那么,你的问题是???看起来它找不到 SeaMAX.dll。 SeaMAX.dll 是否在某个 .NET 应该能够找到的地方?
  • 是的,我更新了我的问题,但 SeaMAX.dll 与 BonderControlPanelSim.dll 位于同一位置,并且 BonderControlPanelSim.dll 使用 SeaMAX dll。

标签: c# .net exception reflection


【解决方案1】:

我想我对这家公司及其产品很熟悉。这是非托管 DLL,用于工业 I/O。问题是 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 环境变量中的目录一样。

【讨论】:

  • 我认为这里是正确的道路。是的,它是不受管理的。但是解决方案没有用。
  • 这被“通常不是”所涵盖。你比我更接近那台机器。阅读帖子的其余部分。
  • 你能添加到我的另一个线程吗? stackoverflow.com/questions/4157620/…
【解决方案2】:

我的猜测是 .net 无法解析程序集引用。 附加到 AppDomain 的 AssemblyResolve 事件并从正确的路径加载程序集:http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve(v=VS.90).aspx

【讨论】:

    【解决方案3】:
      [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetDllDirectory(string dllPath);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多