C# 无法加载库';内核32.dll';。从WCF服务调用时

C# 无法加载库';内核32.dll';。从WCF服务调用时,c#,dll,dllimport,loadlibrary,kernel32,C#,Dll,Dllimport,Loadlibrary,Kernel32,本机方法类如下所示 static class NativeMethods { [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr hModule, string p

本机方法类如下所示

    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,也不会引发任何错误。请在下面找到快照。

我们已经检查了权限是否有问题,但没有帮助


有什么建议吗

启用LastError以查看发生的情况:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr LoadLibrary(string dllToLoad);
如果DllHandle为零,则可以使用

Marshal.GetLastWin32Error().ToString();
这个电话来自faaar,在我记忆深处,我目前无法在VS环境中进行测试,但它应该接近事实


我还记得,您需要完全信任IIS中的项目/设置。不过,对于这一点还不是100%确定。

我们创建了一个新项目,将其作为“WCF服务应用程序”,效果很好

如果项目类型为“WCF服务库”,则不会加载dll句柄

我们仍然不确定为什么这种行为会出现在WCF中


目前为了解决这个问题,我们创建了一个新的“WCF服务应用程序”。

您没有加载
kernel32.dll
。您正在加载
System.Configuration.ConfigurationManager.AppSettings[“MyDll”]
。接下来进行一些调试。首先阅读
LoadLibrary
的文档。它告诉您如何处理错误。如果返回
NULL
,则表示函数失败,您需要调用
GetLastError
以了解原因。对于p/invoke,您需要使用
SetLastError=true
Marshal.GetLastWin32Error()
,或
抛出新的Win32Exception()
您还需要知道
System.Configuration.ConfigurationManager.AppSettings[“MyDll”]
的值。再次进行一些调试。System.Configuration.ConfigurationManager.AppSettings[“MyDll”]包含值。。我已经检查了所有可能的基本错误,但没有找到答案。你没有做我所描述的。谢谢你的建议,大卫。我尝试加载kernel32.dll。但问题似乎有点不同和奇怪。我们创建了一个新项目,将其作为“WCF服务应用程序”,它运行良好。如果项目类型为“WCF服务库”,则不会加载dll句柄。请按照上述建议尝试。不幸的是,它没有返回任何错误。我们仍然无法解决这个问题。