c# 使用LoadLibrary错误码193的问题

linchang_3344 2016-06-09 01:32:02
项目中使用WebApi(VS2013开发,AnyCPU)来实现一个接收文件的服务,
现在接收文件没有问题,但是接收文件后需要进行一些处理,
所以使用VC6写了一个Dll,想在WebApi中动态调用。

DllImport的方式不够灵活,所以使用委托,具体代码如下:

namespace webServer.Classes
{
public class PreProcDllLoader
{
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string strDllFile);

[DllImport("kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, string strProcName);

[DllImport("kernel32.dll")]
private static extern IntPtr FreeLibrary(IntPtr hModule);

[DllImport("kernel32.dll")]
private static extern int GetLastError();

// 委托声明
delegate bool DATAPREPROC(string strDataFile, StringBuilder strError, bool bLogEnabled, string strLogFile, int iLogLevel);

// 预处理动态接口句柄
private IntPtr hModule;
// 函数地址
private IntPtr pDataPreProc;
// 函数接口(函数指针)
private DATAPREPROC InDirectDataPreProc;

// 构造函数
public PreProcDllLoader()
{
hModule = IntPtr.Zero;
pDataPreProc = IntPtr.Zero;
InDirectDataPreProc = null;
}

// 析构函数
~PreProcDllLoader()
{
if (hModule != IntPtr.Zero)
FreeLibrary(hModule);
hModule = IntPtr.Zero;
}

public bool Load(String strDllFile, String strFuncName, StringBuilder strError)
{
String strString;
strString = string.Empty;

// 间接调用
//*/
if (!File.Exists(strDllFile))
{
strString = string.Empty;
strString = string.Format("接口文件不存在!");

strError.Clear();
strError.Append(strString);
return false;
}

if (strFuncName == string.Empty)
{
strString = string.Empty;
strString = string.Format("接口函数为空!");

strError.Clear();
strError.Append(strString);
return false;
}

try
{
hModule = IntPtr.Zero;
hModule = LoadLibrary(strDllFile);
if (hModule == IntPtr.Zero)
{
strString = string.Empty;
strString = string.Format("加载接口失败: {0}", GetLastError());

strError.Clear();
strError.Append(strString);
return false;
}

pDataPreProc = IntPtr.Zero;
pDataPreProc = GetProcAddress(hModule, strFuncName);
if (pDataPreProc == IntPtr.Zero)
{
strString = string.Empty;
strString = string.Format("加载函数失败: {0}", GetLastError());

strError.Clear();
strError.Append(strString);
return false;
}

InDirectDataPreProc = null;
InDirectDataPreProc = (Delegate)Marshal.GetDelegateForFunctionPointer(pDataPreProc, typeof(DATAPREPROC)) as DATAPREPROC;
if (InDirectDataPreProc == null)
{
strString = string.Empty;
strString = string.Format("委托函数失败!");

strError.Clear();
strError.Append(strString);
return false;
}
}
catch (Exception ex)
{
strString = string.Empty;
strString = string.Format("发生异常: {0}", ex.Message);

strError.Clear();
strError.Append(strString);
return false;
}
//*/

return true;
}

public bool ExecuteFunction(string strDataFile, StringBuilder strError, bool bLogEnabled, string strLogFile, int iLogLevel)
{
string strString;
strString = string.Empty;

try
{
//*/
if (InDirectDataPreProc == null)
{
strString = string.Empty;
strString = string.Format("未加载接口!");

strError.Clear();
strError.Append(strString);
return false;
}

return InDirectDataPreProc(strDataFile, strError, bLogEnabled, strLogFile, iLogLevel);
//*/
}
catch (Exception ex)
{
strString = string.Empty;
strString = string.Format("发生异常: {0}", ex.Message);

strError.Clear();
strError.Append(strString);
return false;
}
}

public void Free()
{
if (hModule != IntPtr.Zero)
FreeLibrary(hModule);
hModule = IntPtr.Zero;
}
}
}


在开发环境中(PC1,Win7x64,安装了VC6和VS2013,.NetFx4.5)使用没有任何问题,不管是接收文件还是Load库进行处理;
在另一个环境(PC2,Win7x32,安装了VC6和VS2010,.NetFx4.0)也没有问题。
在生产环境中(PC3,Win7x64,只安装了.NetFx4.0),只能接收文件,LoadLibrary失败,GetLastError得到的错误码193.

不知道为什么?
只有25分了。。。。
...全文
1084 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
JamesYeah77 2016-10-24
  • 打赏
  • 举报
回复
您好~我最近也遇到了类似的问题,因为对dll这块的内容不太懂,所以想请教下楼主。谢谢啦~ 我是64位的电脑上的VS2010里用C++建了一个包含两个项目的解决方案,其中一个生成dll文件,另一个生成的EXE调用dll,结果就是loadlibrary返回null, 错误码是193、 我的配置管理器设置都是DEBUG和x64。网上找了很久也不知道怎么解决。 不知道您有没有什么见解,谢谢您!
linchang_3344 2016-06-10
  • 打赏
  • 举报
回复
引用 4 楼 Saleayas 的回复:
把 AnyCPU 改成 x86 试试。
问题已经解决,确实就是架构的问题,VC6写的预处理接口是32位的Dll 然后WebApi编译成AnyCPU,所以一在x64的系统上运行,就加载不了了, 至于对话框程序Load库可以成功也是因为这个对话框我也是用VC写的。。 最后我回头审了一下,发现实际上PC2是32位的!! 所以PC2可以正常运行,PC3是64位,就无法加载32位的Dll, 但是我的开发环境是64位Win7,调试的时候好像是IISExpress,Load库是OK的 是否表示此时IISExpress也是32位运行的? 最后我将预处理接口使用VS2013重写,并发布了32位版本和64位版本, 再结合IIS的配置enable32bitapponwin64,分别做了测试 结果就是IIS和库都在32位或者64位的时候就没有问题了。 至此问题解决,多谢两位!!
linchang_3344 2016-06-10
  • 打赏
  • 举报
回复
引用 7 楼 shingoscar 的回复:
[quote=引用 5 楼 linchang_3344 的回复:] [quote=引用 3 楼 shingoscar 的回复:] 同一个环境里,如果c++能加在,但c#不能,最大的可能就是编译时候的架构搞错了
我也觉得很可能是这个问题,但是实际上是我在PC1和PC2中进行加载都是OK的 PC1,PC2,PC3都是Win7x64的系统,而WebApi又是AnyCPU的,应该是没问题的。 该怎么考虑PC1,PC2可以加载而PC3无法加载的情况呢[/quote] 1、别用AnyCPU,改成和dll同样的 2、不一定是这个dll,假设你还依赖b.dll,碰巧系统里只有一种,也会出这个错误[/quote] 问题已经解决,确实就是架构的问题,VC6写的预处理接口是32位的Dll 然后WebApi编译成AnyCPU,所以一在x64的系统上运行,就加载不了了, 至于对话框程序Load库可以成功也是因为这个对话框我也是用VC写的。。 最后我回头审了一下,发现实际上PC2是32位的!! 所以PC2可以正常运行,PC3是64位,就无法加载32位的Dll, 但是我的开发环境是64位Win7,调试的时候好像是IISExpress,Load库是OK的 是否表示此时IISExpress也是32位运行的? 最后我将预处理接口使用VS2013重写,并发布了32位版本和64位版本, 再结合IIS的配置enable32bitapponwin64,分别做了测试 结果就是IIS和库都在32位或者64位的时候就没有问题了。 至此问题解决,多谢两位!!
Poopaye 2016-06-09
  • 打赏
  • 举报
回复
引用 5 楼 linchang_3344 的回复:
[quote=引用 3 楼 shingoscar 的回复:] 同一个环境里,如果c++能加在,但c#不能,最大的可能就是编译时候的架构搞错了
我也觉得很可能是这个问题,但是实际上是我在PC1和PC2中进行加载都是OK的 PC1,PC2,PC3都是Win7x64的系统,而WebApi又是AnyCPU的,应该是没问题的。 该怎么考虑PC1,PC2可以加载而PC3无法加载的情况呢[/quote] 1、别用AnyCPU,改成和dll同样的 2、不一定是这个dll,假设你还依赖b.dll,碰巧系统里只有一种,也会出这个错误
linchang_3344 2016-06-09
  • 打赏
  • 举报
回复
引用 4 楼 Saleayas 的回复:
把 AnyCPU 改成 x86 试试。
我也觉得很可能是这个问题,但是实际上是我在PC1和PC2中进行加载都是OK的 PC1,PC2,PC3都是Win7x64的系统,而WebApi又是AnyCPU的,应该是没问题的。 该怎么考虑PC1,PC2可以加载而PC3无法加载的情况呢。 不过我先试一下改x86
linchang_3344 2016-06-09
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
同一个环境里,如果c++能加在,但c#不能,最大的可能就是编译时候的架构搞错了
我也觉得很可能是这个问题,但是实际上是我在PC1和PC2中进行加载都是OK的 PC1,PC2,PC3都是Win7x64的系统,而WebApi又是AnyCPU的,应该是没问题的。 该怎么考虑PC1,PC2可以加载而PC3无法加载的情况呢
Saleayas 2016-06-09
  • 打赏
  • 举报
回复
把 AnyCPU 改成 x86 试试。
Poopaye 2016-06-09
  • 打赏
  • 举报
回复
同一个环境里,如果c++能加在,但c#不能,最大的可能就是编译时候的架构搞错了
linchang_3344 2016-06-09
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
ERROR_BAD_EXE_FORMAT 193 (0xC1) %1 is not a valid Win32 application.
我知道193是这个意思,但是无从下手分析。 实际上这个动态库是没有问题的,用MFC写了个对话框动态加载这个库的话,是完全正常的。 包括在生产环境中,使用MFC对话框直接加载这个库也是可以运行的,就是使用C#加载的话就报错。 而且只在生产环境中会报错,在开发环境中没有问题。。。 我总不能在生产环境中去安装VS
Poopaye 2016-06-09
  • 打赏
  • 举报
回复
ERROR_BAD_EXE_FORMAT 193 (0xC1) %1 is not a valid Win32 application.

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧