我不是要求SO告诉我问题是什么,我只是问我应该在这样的情况下运行健全性检查。
使用Visual Studio 2005,简单的c ++项目。实际代码是:
int Sum(int a, int b)
{
return a+b;
}
没有预编译的标头。使用DEF文件导出:
LIBRARY testdll
EXPORTS
Sum
在测试机器上再次编译(VS2005),DLL可以在其他机器上运行(64位和32位测试,始终使用Win32目标平台编译)。在我的机器上编译(64位,相同的项目,相同的属性),DLL在我的机器上仅,在其他机器上它启动即时调试器(或者如果JIT不是,则崩溃可怕)安装的):
Caller.exe中0x00000000处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。
起初我在我的测试机器上用j调用它,这也会失败,给我(cder
}一个“找不到文件”错误。
其他症状:文件大小不同,我的机器给DLL增加了512个字节。
我的系统配置:
经过测试的环境:
.NET Framework版本2.0.50727 SP2
Windows XP - 64位
答案 0 :(得分:1)
我认为在64位计算机上配置了“Win32目标平台”。我建议您启动“Visual Studio 2005命令提示符”并使用
dumpbin.exe / headers YouDll.dll
检查将在64位计算机上生成的“错误”DLL。您可以将它与“好”DLL进行比较。我想你会马上看到差异。 WinDiff.exe可以为您提供额外帮助。
一个小的一般建议:考虑对从DLL导出的所有函数使用EXTERN_C
和WINAPI
(或__stdcall)。
答案 1 :(得分:1)
打开Dependency Walker中的两个DLL,看看有什么不同。最好在一台DLL运行不正确的机器上执行此操作。