【发布时间】:2016-07-24 00:20:16
【问题描述】:
原生方法类如下所示
static class NativeMethods
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
}
使用 app.config 从本地路径加载 dll
IntPtr pDll = NativeMethods.LoadLibrary(System.Configuration.ConfigurationManager.AppSettings["MyDll"]);
这些方法在类库中实现,可以从 Windows 窗体应用程序和 WCF 服务调用。
当我们从 Win 窗体调用上述方法时,它工作正常。请在下面找到快照。
当我们从 WCF Web 服务调用上述方法时,它无法加载 dll 并且也不会引发任何错误。请在下面找到快照。
我们检查了是否是权限问题,但没有任何帮助。
对此有什么建议吗?
【问题讨论】:
-
你没有加载
kernel32.dll。您正在加载System.Configuration.ConfigurationManager.AppSettings["MyDll"]。接下来做一些调试。首先阅读LoadLibrary的文档。它告诉您如何处理错误。如果返回NULL,则说明函数失败,需要调用GetLastError来查找原因。对于 p/invoke,您需要使用SetLastError = true和Marshal.GetLastWin32Error(),或throw new Win32Exception();您还想知道System.Configuration.ConfigurationManager.AppSettings["MyDll"]的值。再次,做一些调试。 -
System.Configuration.ConfigurationManager.AppSettings["MyDll"] 包含值。我检查了所有可能的基本错误,但找不到答案。
-
你没有做我描述的事情
-
感谢大卫的建议。我尝试加载 kernel32.dll。但这个问题似乎有点不同和奇怪。
-
我们用“WCF 服务应用程序”创建了一个新项目,它工作正常。如果项目类型是“WCF 服务库”,那么它不会加载 dll 句柄。
标签: c# dll dllimport loadlibrary kernel32