一个C++与C#的问题,高手请进

bobui 2011-08-30 10:03:25
项目中使用C++编写了一个底层的通讯引擎,其中有一个方法叫NewGroup(新建一个组),在C++中直接使用是不会出现什么问题,但是用C#调用C++编译出来的Dll就是总是出现一个莫名其妙的问题。
如果使用debug版本调试进入C++代码则问题不会出现,Release版本就会出现问题。

初步怀疑是C#编译器编译出来的机器语言跟实际代码的逻辑不一致产生的,怀疑某些逻辑被编译器优化掉了。请问对于这类错误应该怎么处理或者避免?

程序结构


C++ dll--------->C#外壳-------------->C#应用客户端
...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bobui 2011-09-01
  • 打赏
  • 举报
回复
问题查明了,托管代码编译后执行逻辑和代码逻辑不一致
ouyh12345 2011-08-30
  • 打赏
  • 举报
回复
好像是clr写的dll?
bobui 2011-08-30
  • 打赏
  • 举报
回复
// YSSFixEngineWrapper.h

#pragma once

using namespace System;
using namespace System::Runtime::InteropServices;
#include <gcroot.h>

#include <string.h>

#include "../../src/YSSFIXEngine/IFixMsgParser.h"
#include "../../src/YSSFIXEngine/IFixEnginer.h"

#ifdef _DEBUG
#pragma comment(lib,"../Debug/YSSFIXEngine")
#else
#pragma comment(lib,"../Release/YSSFIXEngine")
#endif // _DEBUG
namespace YSSFixEngineWrapper {

char* CharFromString(const String* str)
{
IntPtr intPtr = Marshal::StringToHGlobalAnsi(const_cast<String*>(str));
char* sz = static_cast<char*>(intPtr.ToPointer());

return sz;
}

String* StringFromChar(const char* sz)
{
String * str = Marshal::PtrToStringAnsi(System::IntPtr::IntPtr((void *) sz));
return str;
}

public __gc class YSSFixMsgParser
{
public:
/* 初始化组件 */
int Init(void)
{
return ::InitFixParser();
}

/* 终止使用组件 */
int Fini(void)
{
return ::FiniFixParser();
}

/* 创建一个消息体对象,成功返回一个标识,错误返回 < 0 */
int NewMessage(void)
{
return ::NewMessage();
}

/* 通过其标识,删除一个消息体对象,错误返回 < 0 */
int DeleteMessage(const int nID)
{
return ::DeleteMessage(nID);
}

/*
* 创建一个群组对象,成功返回一个标识,错误返回 < 0 [消息体标识与群组不能相同,且都唯一]
* nTag : 群组的开始 标签
* nDelim : 结束位置 标签
* naOrder : 群组里标签 顺序
*/
int NewGroup(const int nTag, int nDelim, const int naOrder __gc [])
{
int nLen=naOrder->GetLength(0);

int *naOrder2 = NULL;
if(0<nLen)
{
naOrder2 = new int[nLen];
for(int i=0;i<nLen;i++)
{
naOrder2[i]=naOrder[i];
}
}

return ::NewGroup(nTag,nDelim,naOrder2);
}

...........
..........
...........
fox000002 2011-08-30
  • 打赏
  • 举报
回复
Release 是不能正常调用,还是不能调试

Release 版加没加调试信息?
至善者善之敌 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]
调用约定是否一致?

把c++的函数导出及c#对dll的引用帖出来
[/Quote]

+++1
ouyh12345 2011-08-30
  • 打赏
  • 举报
回复
调用约定是否一致?

把c++的函数导出及c#对dll的引用帖出来

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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