动态加载 .NET DLL 包装 C++ DLL
Dynamically Loading A .NET DLL Wrapping A C++ DLL
我有一个包含 C++ dll 的 .NET 库:
public class Wrapper
{
public void CallFoo()
{
Foo();
}
[DllImport("Unmanaged.dll"), EntryPoint = "foo", CallingConvention = CallingConvention.Cdecl)]
private static extern void Foo();
}
如果我将包装器 dll 添加到 .NET 项目,我就可以调用该方法。但是,如果我尝试如下动态调用该方法,我会得到 DLLNotFoundException(它告诉我 "Unmanaged.dll" 找不到)。
Assembly assembly = Assembly.LoadFrom(@"C:\Wrapper.dll");
Type type = assembly.GetTypes()[0];
dynamic wrapper = Activator.CreateInstance(type);
wrapper.CallFoo();
在 Visual Studio 中,"Unmanaged.dll" 未显示为已加载到模块部分。因此,我假设我应该找到一种加载 "Unmanaged.dll" 的方法。
我愿意接受任何建议。
编辑:"Unmanaged.dll" 与 "Wrapper.dll" 在同一目录中。
如果您的 "Unmanaged.dll" 还依赖于另一个 dll,您仍然会遇到相同的异常。这有点误导,但是如果您添加依赖于工作目录的 DLL,您的问题可能会得到解决。
我有一个包含 C++ dll 的 .NET 库:
public class Wrapper
{
public void CallFoo()
{
Foo();
}
[DllImport("Unmanaged.dll"), EntryPoint = "foo", CallingConvention = CallingConvention.Cdecl)]
private static extern void Foo();
}
如果我将包装器 dll 添加到 .NET 项目,我就可以调用该方法。但是,如果我尝试如下动态调用该方法,我会得到 DLLNotFoundException(它告诉我 "Unmanaged.dll" 找不到)。
Assembly assembly = Assembly.LoadFrom(@"C:\Wrapper.dll");
Type type = assembly.GetTypes()[0];
dynamic wrapper = Activator.CreateInstance(type);
wrapper.CallFoo();
在 Visual Studio 中,"Unmanaged.dll" 未显示为已加载到模块部分。因此,我假设我应该找到一种加载 "Unmanaged.dll" 的方法。
我愿意接受任何建议。
编辑:"Unmanaged.dll" 与 "Wrapper.dll" 在同一目录中。
如果您的 "Unmanaged.dll" 还依赖于另一个 dll,您仍然会遇到相同的异常。这有点误导,但是如果您添加依赖于工作目录的 DLL,您的问题可能会得到解决。