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表单调用上面的方法时,它工作正常。请在下面找到快照。
当我们从WCF Web服务调用上述方法时,它无法加载dll,也不会抛出任何错误。请在下面找到快照。
我们已经检查过它是否存在权限问题,但没有任何帮助。
对此有何建议?
答案 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服务应用程序”。