无法LoadLibrary'kernel32.dll'。从WCF服务调用时

时间:2016-04-04 12:42:17

标签: c# dll dllimport loadlibrary kernel32

Native methods类看起来像这样

@echo off

cls

set /P AA="Is this information correct (Y/[N]) ? "
if /I "%AA%" == "Y" (

    echo Setting up %DATE% %TIME% ...

    echo Copying stuff to the places ...

    set /P BB="Overwrite (Y/[N]) ? "
    if /I "%BB%" == "Y" (

        echo Executing xxx ...

    ) else echo NOPE1 [%BB%]

    set /P CC="Overwrite (Y/[N]) ? "
    if /I "%CC%" == "Y" (

        echo Executing xxx ...

    ) else echo NOPE2 [%CC%]

    echo All set !

) else echo Setup aborted [%AA%] !

pause

使用app.config从本地路径加载dll

    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);
    }

这些方法在类库中实现,可以从Windows窗体应用程序以及WCF服务调用。

当我们从Win表单调用上面的方法时,它工作正常。请在下面找到快照。 enter image description here

当我们从WCF Web服务调用上述方法时,它无法加载dll,也不会抛出任何错误。请在下面找到快照。 enter image description here

我们已经检查过它是否存在权限问题,但没有任何帮助。

对此有何建议?

2 个答案:

答案 0 :(得分:0)

启用LastError以查看,会发生什么:

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

如果DllHandle为零,您可以使用

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

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

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

答案 1 :(得分:0)

我们创建了一个新项目作为“WCF服务应用程序”,它工作正常。

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

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

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