所以我使用一些反射从网络驱动器上的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 ......但它的存在。我错过了什么
答案 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:\远程\调试\”);