c#调用C++DLL问题。

问题描述

大家好,我是做C#的,项目用到一个C++的DLL,但是一直调用不到这个DLL的方法,后来听说这个DLL要加上_declspec,但有没有DLL的源码和lib,那我要怎么给它加?好像是要新建一个DLL,再调用原来的DLL,是吗,?怎么实现。

解决方案

解决方案二:
C#调用的话,没有lib没关系,但是要有函数原型定义。cdecl和stdcall都可以支持。
解决方案三:
O(∩_∩)O~http://www.cppblog.com/mzty/archive/2007/12/25/39610.htmlC#的Form通过CLI调用C++的DLL一方法C#的project调用C++的DLL,一般也有3中方法:1)最简单的方法,通过PInvoke,但是只能调用全局function,不能调用Class。2)通过COM封装调用。3)通过CLI作为中介,也即本文章所讲的。二实例1)假如我们有的Math的dll,classCPPDLL_APIMath{public:staticdoubleAdd(doublex,doubley);staticdoubleMultiply(doublex,doubley);};classCPPDLL_APIAdvancedMath{public:staticintFactorial(intx);};doubleMath::Add(doublex,doubley){returnx+y;}doubleMath::Multiply(doublex,doubley){returnx*y;}intAdvancedMath::Factorial(intx){if(x<=0)return0;if(1==x)return1;returnx*Factorial(x-1);}2)C++的MFC的Dialog调用(比较烦,特别是MFC的controls太少了。各种String间的转化也和累啊,我这里为了简化,不得不把vs05中默认的unicode改为非unicode)#pragmacomment(lib,"../debug/cppdll.lib")#include"../cppdll/cppdll.h"voidCCppTestDlg::OnBnClickedButton1(){switch(m_op){caseAdd:{CStringxStr;m_EditX.GetWindowText(xStr);CStringyStr;m_EditY.GetWindowText(yStr);doublex=atof(xStr);doubley=atof(yStr);doublesum=Math::Add(x,y);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}caseMultiply:{CStringxStr;m_EditX.GetWindowText(xStr);CStringyStr;m_EditY.GetWindowText(yStr);doublex=atof(xStr.GetBuffer());doubley=atof(yStr);doublesum=Math::Multiply(x,y);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}caseFactorial:{CStringxStr;m_EditX.GetWindowText(xStr);doublex=atoi(xStr);doublesum=AdvancedMath::Factorial(x);CStringsumStr;sumStr.Format("%f",sum);m_EditSum.SetWindowText(sumStr);break;}default:break;}}3)CLI的wrapper#pragmaonceclassMath;classAdvancedMath;namespaceCppMathLib{publicrefclassMathWrapper{public:staticdoubleAdd(doublex,doubley);staticdoubleMultiply(doublex,doubley);};publicrefclassAdvancedMathWrapper{public:staticintFactorial(intx);};}#include"stdafx.h"#include"MathWrapper.h"#pragmacomment(lib,"../debug/CppDLL.lib")#include"../CppDLL/cppdll.h"usingnamespaceCppMathLib;doubleMathWrapper::Add(doublex,doubley){returnMath::Add(x,y);}doubleMathWrapper::Multiply(doublex,doubley){returnMath::Multiply(x,y);}intAdvancedMathWrapper::Factorial(intx){returnAdvancedMath::Factorial(x);}4)C#的Form调用CLI的wrapperusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;namespaceCsharpTest{enumOperation{Add,Multiply,Factorial,None}publicpartialclassForm1:Form{privateOperationop=Operation.None;publicForm1(){InitializeComponent();}privatevoidradioButtonMultiply_CheckedChanged(objectsender,EventArgse){op=Operation.Multiply;textBoxY.Enabled=true;}privatevoidradioButtonAdd_CheckedChanged(objectsender,EventArgse){op=Operation.Add;textBoxY.Enabled=true;}privatevoidradioButtonFactorial_CheckedChanged(objectsender,EventArgse){op=Operation.Factorial;textBoxY.Text="0";textBoxY.Enabled=false;}privatevoidbutton1_Click(objectsender,EventArgse){switch(op){caseOperation.Add:textBoxSum.Text=CppMathLib.MathWrapper.Add(Double.Parse(textBoxX.Text),Double.Parse(textBoxY.Text)).ToString();break;caseOperation.Multiply:textBoxSum.Text=CppMathLib.MathWrapper.Multiply(Double.Parse(textBoxX.Text),Double.Parse(textBoxY.Text)).ToString();break;caseOperation.Factorial:textBoxSum.Text=CppMathLib.AdvancedMathWrapper.Factorial(Int32.Parse(textBoxX.Text)).ToString();break;default:break;}}privatevoidbutton2_Click(objectsender,EventArgse){this.Close();}}}三截图比较前面的是C++的MFC的dialog,后面的C#的Form,看起来一样哦,就是开发速度不同!
解决方案四:
楼上的回答很详细了。就是的。一般都是写dllimport。写成函数。再调用。

时间: 2024-07-31 08:49:18

c#调用C++DLL问题。的相关文章

异常-c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误

问题描述 c# 程序调用外部dll文件对采集模块进行读写,不定时出现以下错误 问题签名: 问题事件名称: BEX 应用程序名: NangGang11.20.vshost.exe 应用程序版本: 9.0.21022.8 应用程序时间戳: 47316898 故障模块名称: MSVCR80.dll 故障模块版本: 8.0.50727.6195 故障模块时间戳: 4dcddbf3 异常偏移: 00008aa0 异常代码: c000000d 异常数据: 00000000 解决方案 光给出一个异常信息,天知

C# 制作Com组件:java调用.net DLL的方法

本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:"在Java项目中必须使用其提供的用.net写的DLL加密机制!" 环境与工具: ◆.net framework 3.5 C# ◆java jdk1.5, Tomcat 5.5 ◆jacob-1.15-M3 实现例子: 一.C# 制作Com组件 新建一个Class 项目,取名TestCom 代码 using System;  using System.Collections.Generic;  us

跨越语言的障碍:C++调用C# DLL

当C#项目需要引用C++dll的时候可以直接使用DLLIMPORT来进行调用.而反向的话,C++项目并不能简单靠引用来使用C#DLL.因为C++项目默认配置是没有公共语言运行库支持的.所以我们需要更改一些配置来进行对C# dll的调用.步骤如下: 首先我们完成C# dll开发: namespace Csharp { public class Class1 { public string Name = string.Empty; public Class1() { Name = "We can u

JAVA调用动态链接库DLL:JNative学习

JAVA调用动态链接库DLL的方法有:JNI(Java Native Interface),JInvoke,JNative(Java to native interface),JNI是JAVA自身提供的方法:JInvoke从何而来不得而知,好像还需要注册付费的,64位的JDK.JIR环境下运行不了,在VMware下安装的WindowsXP下同样有问题:JNative是开源的,但相关资料文档也特别的少,好像已经停止更新了.JNative源码地址:http://jnative.cvs.sourcef

C#实现动态调用Windows DLL

调用方法: object obj = WinDllInvoke("Kernel32.dll", "Beep", new object[] { 750, 300 }, typeof(void)); 函数代码: 1 [System.Runtime.InteropServices.DllImport("kernel32")] 2 private static extern IntPtr LoadLibrary(string lpLibFileName)

struct-关于C#调用C++dll的问题

问题描述 关于C#调用C++dll的问题 在c#调用dll中遇到了个巨坑,请大侠&大神帮忙c++定义://! 长度为10的字符串typedef char TAPISTR_10[11];typedef char TAPICHAR;typedef char TAPIDTSTAMP[24]; //! int 32typedef int TAPIINT32;//! unsigned 32typedef unsigned int TAPIUINT32;//! int 64typedef long long

java 如何调用mwrf32.dll

问题描述 java 如何调用mwrf32.dll mwrf32.dll据说是ic读卡器的通用开发dll, 调用这个里边的方法都需要传递一个设备标识的字段, 这个字段是怎么获取的,我的环境是window8. 希望做过类似读卡器开发的大神帮助一下 解决方案 http://www.open-open.com/home/space-37924-do-blog-id-5681.html 解决方案二: java 调用user32.dll 锁定电脑使用ctypes调用kernel32.dll中的函数10.4.

时间格式-C#调用Kernel32.dll下SetLocaleInfo接口,修改操作系统中的时间的问题

问题描述 C#调用Kernel32.dll下SetLocaleInfo接口,修改操作系统中的时间的问题 自己试用locale_sshortdate修改成功了日期格式,时间格式却修改不了,实用的是locale_STIME和LOCALE_ITIME,,LOCALE_STIMEFORMAT,不知道是定义的值不对还是格式不对就是修改不了,希望大牛们帮下忙, DllImport("kernel32.dll", EntryPoint = "GetSystemDefaultLCID&quo

封装-js调用ocx dll库(存在依赖库dll)出现问题

问题描述 js调用ocx dll库(存在依赖库dll)出现问题 最近遇到一个问题,我使用vc6封装的 atl-- dll的ocx控件, 名字为 test.dll (内部就一个add接口), 通过js调用,可以调用成功, 然后我又封装了一个 ocx的dll,名字为a.dll, a依赖于b.dll(这个就是一个动态链接库), 注册a.dll之后,再用js调用,单步调试浏览器就会报错:"对象不支持此属性和方法",这个是什么原因导致的? 解决方案 最有可能的原因,控件没有部署好,或者安全性问题

vb net vfp6 0 dll-如何利用vfp编写一个dll?如何利用vb.net调用这个dll?

问题描述 如何利用vfp编写一个dll?如何利用vb.net调用这个dll? 问题1需要一个vfp写的dll,代码如下:DEFINE CLASS VpfUpdate AS CUSTOM OLEPUBLICFUNCTION VpfUpdate(tableSource AS String, tableTarget as String) as String USE (tableSource) COPY TO (tableTarget) TYPE Fox2x RETURN tableTargetENDF