C#调用C++ dll

marquess 2008-09-28 03:50:02
我用C#调用C++的dll

如果dll中函数很简单,
int add(int a, int b)
{
return a+b;
}

这样就可以调用。

如果里面有窗体
bool config()
{
CAppOptions dlg;
dlg.DoModal();
return true;
}

那就会出错,Debug assert Failed

什么原因?
...全文
1128 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
colour2006 2009-06-16
  • 打赏
  • 举报
回复
将export 的函数使用
extern "C"
{
}
包含就可以了,这是由于C++编译器,在编译时候,将函数进行重新命名,
使用上面语法之后,可以关闭编译器编译时期的函数重命名机制( name mangling)。
marquess 2008-10-07
  • 打赏
  • 举报
回复
我也查了一下,好像是MFC扩展dll的问题。

他只能被MFC程序调用。

是不是这个原因呢?
yc_8301 2008-10-06
  • 打赏
  • 举报
回复
友情up
感觉托管代码,调用非托管的东西总是存在一些疑难杂症。。
特别涉及到内存处理的时候,期待高手解决。。
marquess 2008-10-06
  • 打赏
  • 举报
回复
我在网上看到Dll有三种:

Win32DLL: 不使用MFC库,可被任何程序使用。
MFC Regular DLL 使用MFC库,与MFC库静态或动态连接,可被任何程序使用。
MFC Extension DLL ,与MFC动态联合编译,只能被MFC程序使用。

C#能否调用 MFC Extension DLL 呢?
marquess 2008-09-30
  • 打赏
  • 举报
回复
我看了一下你说的参考的那个东西,上网搜了,别人也有这个问题。
不过具体怎么写还没弄懂。

我在C++里加了一句
AFX_MANAGE_STATE(AfxGetStaticModuleState());
编译出错
__pRawDllMain already defined in OAClient.obj

换成
AfxSetModuleState(AfxGetThreadState()->m_pPrevModuleState);
还是不行
marquess 2008-09-30
  • 打赏
  • 举报
回复
我对C++不是很熟,那个dll是别人写的。所以要换成正规dll,只能从小的地方进行修改。谢谢你

你说的CreateWindow是什么意思?
palmax 2008-09-28
  • 打赏
  • 举报
回复
C#调用没错,C++的config函数在dll里有问题,参考SetResourceHandle AFX_MANAGE_STATE
greatws 2008-09-28
  • 打赏
  • 举报
回复
资源的问题?有没有图标资源?


不过我建议你不要用扩展DLL了,出的问题很多,用API CreateWindow之类的一般不会出问题

marquess 2008-09-28
  • 打赏
  • 举报
回复
我调试跟进了一下,到了afxwin2.inl里。

这下面代码里出的问题

_AFXWIN_INLINE HICON CWinApp::LoadIcon(UINT nIDResource) const
{ return ::LoadIcon(AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource),
RT_GROUP_ICON), MAKEINTRESOURCE(nIDResource)); }
marquess 2008-09-28
  • 打赏
  • 举报
回复

private void btConfig_Click(object sender, EventArgs e)
{
App.config();
}

public class App
{
[DllImport("OAClient.dll", EntryPoint = "config", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
public static extern bool config();
}
palmax 2008-09-28
  • 打赏
  • 举报
回复
把你C#的调用代码贴出来
marquess 2008-09-28
  • 打赏
  • 举报
回复
楼上的,那有没有解决方法呢?

难道那个dll只能用VC调用
shenyi0106 2008-09-28
  • 打赏
  • 举报
回复
MFC为非托管的,C#为托管的,
如果按
bool config()
{
CAppOptions dlg;
dlg.DoModal();
return true;
}
这样的写法,那谁来销毁CAppOptions对象呢?
fangsp 2008-09-28
  • 打赏
  • 举报
回复
帮忙顶一个
期待高手的到来

15,466

社区成员

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

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