使用反射调用DLL但需要另一个DLL抛出异常

时间:2010-11-10 17:28:55

标签: c# .net exception reflection

所以我使用一些反射从网络驱动器上的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 ......但它的存在。我错过了什么

3 个答案:

答案 0 :(得分:4)

我想我对这家公司及其产品很熟悉。这是非托管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环境变量上的目录一样。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

  [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetDllDirectory(string dllPath);

SetDllDirectory会(@ “G:\远程\调试\”);