【求助】C#调用C++函数遇到问题,血泪求助!

问题描述

目的:VS2010中,将一个C++函数代码封装的DLL供C#函数调用描述:在C++代码中,该函数声明为:__declspec(dllexport)boolMatrix_PolyFit(double*x,double*y,intX_Y_Number,intFit_N,double*ks);已经正常生成了dll生成dll的C++工程选了“类库”,把里面自动生成的publicrefclass去掉了,所有函数和函数定义代码都直接拷贝在PolyFit.h文件中,PolyFit.cpp文件是空的。C#中调用时,参照网上的说法在我自己的类中做了dll引用:[DllImport("PolyFit.dll",EntryPoint="Matrix_PolyFit")]publicstaticexternboolMatrix_PolyFit(IntPtrx,IntPtry,intX_Y_Number,intFit_N,IntPtrks);且PloyFit.dll已经拷贝到C#工程的debug文件夹下由于C++函数的参数用了指针,所以在C#中传参数千已经把double[]按如下方法转换为IntPtr:double[]fitX=newdouble[655];GCHandlehX;hX=GCHandle.Alloc(fitX,GCHandleType.Pinned);最后调用时语句为:boolsucessFlag=Matrix_PolyFit(hX.AddrOfPinnedObject(),hY.AddrOfPinnedObject(),655,fitOrder,hKS.AddrOfPinnedObject());编译通过,但是每次运行到这个函数调用时,就报“无法在DLL“PolyFit.dll”中找到名为“Matrix_PolyFit”的入口点”。实在不知道为什么,千辛万苦试了好几天还是没办法,特来求助各位大神!万分感谢!

解决方案

解决方案二:
VC++编译的时候,会对函数名称进行修饰,,,也就是说,你声明是Matrix_PolyFit,但是导出可能是Matrix_PolyFit@******这类的提供的代码不全,不知道你的编译设置,不敢肯定一定是这个问题..你可以用dependencywalker看下函数具体导出名称.就知道了.
解决方案三:
建议将C++中的所有接口函数均以纯C方式导出,方便各种语言环境调用extern"C"{//告诉C+++编译器,扩号里按照C的命名规则编译voidCPP_fun(){.....}}

时间: 2024-11-16 09:51:00

【求助】C#调用C++函数遇到问题,血泪求助!的相关文章

matrix-请问调用时候参数写什么?求助大神!我是个小白!

问题描述 请问调用时候参数写什么?求助大神!我是个小白! class Matrix:public MATRIX { public: Matrix():MATRIX(){} Matrix( int c, int r ):MATRIX(c,r){} Matrix( const Matrix& m){ *this = m; } const Matrix& operator+=( const Matrix& m ); const Matrix& operator-=( const

VC调用JavaScript函数--处理QQ网页登录密码加密(空间、农场、WEB QQ等)

相信很多朋友都对QQ伴侣等农场外挂十分好奇吧!其实我也是,然而不幸的是很多像我一样的兄弟在模拟农场登录时,就被JS函数加密的密码字符串给挡在门外,于是百度来google去,始终没有一个完整的代码或例子. 登录时用OmniPeek捕获得到的数据包如下(QQ号1.密码123456.验证码1234): 其实QQ网页登录密码加密方式(包括空间.农场.WEB QQ等)都是一样的. http://imgcache.qq.com/ptlogin/js/comm.js 周末自己便将腾讯JS加密文件给下载下来了.

javascript如何调用java函数,并且页面不刷新

问题描述 大家好!帮忙一下.问题如下:我做一个打印页面,用到window.print();但是要操作数据库,把该记录置于"已打印"状态,所以得调用java函数,可以通过serlvet解决,但是得跳转页面,我想实现点击"打印"按钮时,页面不刷新,又能更新后台数据库数据..大家帮帮忙,看如何处理比较恰当.非常感谢! 解决方案 解决方案二:呵呵,用Ajax或者jquery的异步提交,很容易的.楼主网上搜搜,祝你好运解决方案三:单纯使用javascript+servlet会

求助:调用包含并行计算的m文件编译成的动态链接库

问题描述 求助:调用包含并行计算的m文件编译成的动态链接库 请问如何在c++环境下调用包含并行计算(parfor)的MATLAB编译好的动态链接库(C++ shared library)?当m文件中不包含matlabpool open时,动态链接库是可以成功调用的,但是一旦m文件中包含matlabpool open,调用时会出现错误: "XXX exited with code -529697949" 求大神帮忙,如何调用含有并行计算的MATLAB动态链接库? 我的环境是:win7,Q

Applet调用&#106avascript函数

函数 在做的的applet中用到了调用javascript程序调用方法如下:1 首先引入JSObject 包 // LiveConnect... for JavaScriptimport netscape.javascript.JSObject ;2 在调用js的地方用:try { // 创创建JSObjectJSObject.getWindow (this).eval ("javascript::window.open()")}catch (Exception ex) { 错误提示}

sql server 2005中使用apply对每行调用表值函数

server|函数 使用 APPLY 运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数.表值函数作为右输入,外部表表达式作为左输入.通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出.APPLY 运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表. <?XML:NAMESPACE PREFIX = O /> APPLY 有两种形式: CROSS APPLY 和 OUTER APPLY.CROSS APPLY 仅返回外部表中通过表值函数生成结果

JAVA/JSP学习系列之十三(Applet调用&amp;#106avascript函数)(译)

js|函数 下面的例子将说明在applet中去调用javascript函数 . 一.applet源代码(tmin_JS.java) // Importationsimport java.awt.Graphics ;import java.awt.Event ; // LiveConnect... for JavaScriptimport netscape.javascript.JSObject ; public class tmin_JS extends java.applet.Applet {

C#中调用API函数RegisterHotKey注册多个系统热键

函数 要设置快捷键必须使用user32.dll下面的两个方法. BOOL RegisterHotKey( //注册系统热键的API函数 HWND hWnd, int id, UINT fsModifiers, UINT vk );  BOOL UnregisterHotKey( //删除系统热键的API函数 HWND hWnd, int id );  在C#中引用命名空间System.Runtime.InteropServices;来加载非托管类user32.dllusing System;us

《Effective C++》读书笔记09:绝不在构造和析构过程中调用virtual函数

首先明确一下,对于一个继承体系,构造函数是从基类开始调用了,而析构函数则正 好相反,从最外层的类开始. 对于在构造函数中调用virtual函数,先举个例子: 1 class Transaction //所有交易的基类 2 { 3 public: 4 Transaction(); 5 virtual void logTransaction() const = 0;//日志记 录,因交易类型的不同而有不同的记录 6 } 7 8 Transaction::Transaction()//构造函数实现 9

调用虚拟函数、持续化视图状态及POD类型概念

在 C++ 中,无法从某个类的构造函数中调用派生的虚拟函数,因为虚表还没有完全建立.但是在C#中好像就可以,是这样吗?为什么会有这种差别呢? 确实如此,在这个方面 C# 与 C++ 是有差别的.在 C++ 中,如果你从构造函数或者析构函数中调用虚拟函数,编译器调用的虚拟函数是定义在这个正在被构造的类实例中的(例如,如果从 Base::Base 中调用 Base::SomeVirtFn ),不是最底层派生的实例(the most derived instance),正像你说的那样,因为在最底层派生