【问题标题】:Unable to LoadLibrary 'kernel32.dll'. When invoked from WCF service无法加载库“kernel32.dll”。从 WCF 服务调用时
【发布时间】: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 = trueMarshal.GetLastWin32Error(),或 throw new Win32Exception(); 您还想知道 System.Configuration.ConfigurationManager.AppSettings["MyDll"] 的值。再次,做一些调试。
  • System.Configuration.ConfigurationManager.AppSettings["MyDll"] 包含值。我检查了所有可能的基本错误,但找不到答案。
  • 你没有做我描述的事情
  • 感谢大卫的建议。我尝试加载 kernel32.dll。但这个问题似乎有点不同和奇怪。
  • 我们用“WCF 服务应用程序”创建了一个新项目,它工作正常。如果项目类型是“WCF 服务库”,那么它不会加载 dll 句柄。

标签: c# dll dllimport loadlibrary kernel32


【解决方案1】:

我们使用“WCF 服务应用程序”创建了一个新项目,它运行良好。

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

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

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

【讨论】:

    【解决方案2】:

    启用 LastError 看看会发生什么:

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr LoadLibrary(string dllToLoad);
    

    如果 DllHandle 为零,则可以通过

    获取最后一个错误
    Marshal.GetLastWin32Error().ToString();
    

    这个电话来自我记忆深处的faaar,我目前无法在VS环境中测试,但它应该接近真相。

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

    【讨论】:

    • 尝试了上述建议。不幸的是,它没有返回任何错误。我们仍然无法找出问题所在。
    猜你喜欢
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多