WIN7下用VC2010调用C#的DLL,出现KernelBase.dll的错误

莫然亦可 2013-07-22 04:41:29
环境WIN7,VC2010,C++调用C#的DLL。注册成功,LoadLibrary也能找到,在调用时抛出中断。
输出里:
“C.exe”: 已加载“C:\Windows\System32\mscoree.dll”,已加载符号(去除源信息)。
“C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll”,已加载符号(去除源信息)。
“C.exe”: 已加载“C:\Windows\System32\sxs.dll”,已加载符号(去除源信息)。
“C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll”,已加载符号(去除源信息)。
“C.exe”: 已加载“C:\Windows\System32\msvcr100_clr0400.dll”,已加载符号(去除源信息)。
C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: 0x04242420: 0x4242420
“C.exe”: 已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\4b31b2b5c9fb245c4f5c4ec9d182c0f4\mscorlib.ni.dll”,符号文件中不存在本机符号。
“C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll”,已加载符号(去除源信息)。
C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x0013b540 处的 EEFileLoadException。
C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。
C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。
C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。
HEAP[C.exe]: Invalid address specified to RtlValidateHeap( 004B0000, 0013DFA4 )
Windows 已在 C.exe 中触发一个断点。

其原因可能是堆被损坏,这说明 C.exe 中或它所加载的任何 DLL 中有 Bug。

原因也可能是用户在 C.exe 具有焦点时按下了 F12。

输出窗口可能提供了更多诊断信息。

我上网查了下,KernelBase.dll的错误有可能是win7下需要管理员身份运行。
下下策,换成XP,如果不换系统有没有什么好的解决办法。
请教大家,遇到这类问题的和知道解决办法的给个答案,不胜感激!
...全文
4772 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
LinKun 2014-03-26
  • 打赏
  • 举报
回复
可能是程序中文件访问权限的问题,之前有一次把文件路径的斜杠和反斜杠写反了,改过来就通过了。
lancheng1013 2014-01-10
  • 打赏
  • 举报
回复
引用 楼主 alice729 的回复:
环境WIN7,VC2010,C++调用C#的DLL。注册成功,LoadLibrary也能找到,在调用时抛出中断。 输出里: “C.exe”: 已加载“C:\Windows\System32\mscoree.dll”,已加载符号(去除源信息)。 “C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll”,已加载符号(去除源信息)。 “C.exe”: 已加载“C:\Windows\System32\sxs.dll”,已加载符号(去除源信息)。 “C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll”,已加载符号(去除源信息)。 “C.exe”: 已加载“C:\Windows\System32\msvcr100_clr0400.dll”,已加载符号(去除源信息)。 C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: 0x04242420: 0x4242420 “C.exe”: 已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\4b31b2b5c9fb245c4f5c4ec9d182c0f4\mscorlib.ni.dll”,符号文件中不存在本机符号。 “C.exe”: 已加载“C:\Windows\Microsoft.NET\Framework\v4.0.30319\nlssorting.dll”,已加载符号(去除源信息)。 C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x0013b540 处的 EEFileLoadException。 C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。 C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。 C.exe 中的 0x755d812f (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。 HEAP[C.exe]: Invalid address specified to RtlValidateHeap( 004B0000, 0013DFA4 ) Windows 已在 C.exe 中触发一个断点。 其原因可能是堆被损坏,这说明 C.exe 中或它所加载的任何 DLL 中有 Bug。 原因也可能是用户在 C.exe 具有焦点时按下了 F12。 输出窗口可能提供了更多诊断信息。 我上网查了下,KernelBase.dll的错误有可能是win7下需要管理员身份运行。 下下策,换成XP,如果不换系统有没有什么好的解决办法。 请教大家,遇到这类问题的和知道解决办法的给个答案,不胜感激!
我的电脑里为什么没有NativeImages_v4.0.30319_32这个目录请问大神哪里来的
莫然亦可 2013-12-10
  • 打赏
  • 举报
回复
引用 14 楼 Mark0532 的回复:
给你的DLL不对吧,找给你DLL的人来给你调一下
恩,这个问题调好了,就是对方自己调了下,再给我就能用了。怎么调的我也不知道。感谢大家的帮助,现结贴发分。
Mark0532 2013-12-10
  • 打赏
  • 举报
回复
给你的DLL不对吧,找给你DLL的人来给你调一下
莫然亦可 2013-08-02
  • 打赏
  • 举报
回复
引用
以前我做的一个项目也出现过这种报错信息。 原因是dll中的某些内存分配问题。 解决方法:改变项目的编译方式,改为动态链接到mfc;或者改变dll的实现。
你说的可是MFC的使用方法:在DLL共享中使用MFC?如果是,我的设置是这个,还是有这个错。
jianzhanger 2013-07-25
  • 打赏
  • 举报
回复
以前我做的一个项目也出现过这种报错信息。 原因是dll中的某些内存分配问题。 解决方法:改变项目的编译方式,改为动态链接到mfc;或者改变dll的实现。
莫然亦可 2013-07-24
  • 打赏
  • 举报
回复
引用
clr 在自家操作系统上都乱七八糟了
此出何解?
fly4free 2013-07-23
  • 打赏
  • 举报
回复
DLLA.dll 是 C# 编写的? 你怎么能直接 GetProcAddress 呢? (要是用 托管C++ 还差不多) 他用的 .net运行时是什么版本,你机器上安装的呢?
莫然亦可 2013-07-23
  • 打赏
  • 举报
回复
HINSTANCE hinstDLL= LoadLibrary("DLLA.dll");
	DWORD k=GetLastError();
UpdateData(FALSE);
if(hinstDLL)
{
typedef int(*Add)(wchar_t*, wchar_t*);
Add AddA = NULL;
AddA = (Add)GetProcAddress(hinstDLL, "Add");
k=GetLastError();
if(AddA)
{
wchar_t *w_A = Name.AllocSysString();
wchar_t *w_B = Mark.AllocSysString();
AddA(w_A, w_B);
k=GetLastError();
}
FreeLibrary(hinstDLL);
}
UpdateData(FALSE);
代码很简单,这套代码在给我DLL那个人的机器上是没问题的。到我这就调用不了。在AddA(w_A,w_B);这句抛出中断。错误内容如贴的内容。就是不知道为什么会这样。
fly4free 2013-07-23
  • 打赏
  • 举报
回复
Windows API 即使在现在权限不足的时候,也不可能会导致崩溃把. 如果不是自己代码的问题的话,这绝对是bug!
hdg3707 2013-07-23
  • 打赏
  • 举报
回复
1. DLl的程序加上具有管理员的权限,可以从网上查如何让C#程序具有管理员权限,这个不如VC简单,需要增加个文件,再修改文件一个属性 2. 再把VC程序也加上具有管理员权限:在项目上右击->属性->链接器->清单文件->UAC执行级别->requireAdministrator (/level='requireAdministrator')
Dobzhansky 2013-07-23
  • 打赏
  • 举报
回复
clr 在自家操作系统上都乱七八糟了
fly4free 2013-07-23
  • 打赏
  • 举报
回复
(用dependency工具看看其导出函数有没有你见到的函数) 然后不管如何,你还是使用COM接口的方式吧,如果那还有问题,应该是他的问题。 虽然我想说:让他在你机器上调试下……
莫然亦可 2013-07-23
  • 打赏
  • 举报
回复
是COM,我也是打算那样来写接口调用的,只是对方就是用这种奇怪的用法实现的,而且他还能用。既然他能用,那我就按这种方式调用了。
fly4free 2013-07-23
  • 打赏
  • 举报
回复
好奇怪的用法。我认为 VC编写的程序调用c#的dll有两种, 1。 C#的dll注册成com组件,通过接口调用 2. 用 Managed C++ 编写extern "C" 导出的函数。 再有我就不知道了。
fly4free 2013-07-23
  • 打赏
  • 举报
回复
引用 5 楼 alice729 的回复:
引用
DLLA.dll 是 C# 编写的? 你怎么能直接 GetProcAddress 呢? (要是用 托管C++ 还差不多) 他用的 .net运行时是什么版本,你机器上安装的呢?
是C#编写的,其实我也觉得不该用GetProcAddress,但对方是这么用的,对方在自已机器上用C++这样调用,没有问题。他用的VS2010,为了避免不一样,我也换成2010了。都是在framework4.0下注册的,注册也成功。
是COM吗? 怎么还需要注册?
莫然亦可 2013-07-23
  • 打赏
  • 举报
回复
引用
DLLA.dll 是 C# 编写的? 你怎么能直接 GetProcAddress 呢? (要是用 托管C++ 还差不多) 他用的 .net运行时是什么版本,你机器上安装的呢?
是C#编写的,其实我也觉得不该用GetProcAddress,但对方是这么用的,对方在自已机器上用C++这样调用,没有问题。他用的VS2010,为了避免不一样,我也换成2010了。都是在framework4.0下注册的,注册也成功。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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