c++中如何java调用c dll#的dll

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
阅读(1531)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_084075',
blogTitle:'C++调用C#的DLL程序方法[引用]',
blogAbstract:'\r\n\r\n\r\n\r\n\r\n\r\n\r\n&&& SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目中,怎么让C++调用C#的DLL呢。今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现: warning&C4819:&该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为&Unicode&格式以防止数据丢失。 接着就是一大堆的0x01等等。自己做了个Sample,仔细分析发现还是自己没有搞清楚。正确的操作如下: 1&创建C#&DLL,需要指定应用类型为“类库”,代码: namespace&CSLib { &&&&public&class&Class1 ',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:1,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}2943人阅读
因为C#中使用DllImport是不能像动态load/unload assembly那样,所以只能借助API函数了。在kernel32.dll中,与动态库调用有关的函数包括[3]:
①LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
②GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
③FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。
它们的原型分别是:
HMODULE LoadLibrary(LPCTSTR lpFileName);
FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName);
BOOL FreeLibrary(HMODULE hModule);
现在,我们可以用IntPtr hModule=LoadLibrary(&Count.dll&);来获得Dll的句柄,用IntPtr farProc=GetProcAddress(hModule,&_count@4);来获得函数的入口地址。
但是,知道函数的入口地址后,怎样调用这个函数呢?因为在C#中是没有函数指针的,没有像C++那样的函数指针调用方式来调用函数,所以我们得借助其它方法。经过研究,发现我们可以通过结合使用System.Reflection.Emit及System.Reflection.Assembly里的类和函数达到我们的目的。为了以后使用方便及实现代码的复用,我们可以编写一个类。
1)dld类的编写:
1.打开项目&Test&,打开类视图,右击&Tzb&,选择&添加&--&&类&,类名设置为&dld&,即dynamic loading dll 的每个单词的开头字母。
2.添加所需的命名空间及声明参数传递方式枚举:
需用此命名空间
类需用此命名空间
需用此命名空间
3. 在&public class dld&的上面,添加如下代码声明参数传递方式枚举:
/// &summary&
/// 表示值传递,ByRef 表示址传递
/// &/summary&
public enum ModePass
ByValue = 0x0001,
ByRef = 0x0002
class DLD中,添加如下代码:
public class DLD
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProceName);
[DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);
/// &summary&
/// Loadlibrary
/// &/summary&
private IntPtr hModule = IntPtr.Z
/// &summary&
/// GetProcAddress
/// &/summary&
private IntPtr farProc = IntPtr.Z
/// &summary&
/// &/summary&
/// &param name="lpFileName"&DLL
public void LoadDll(string lpFileName)
hModule = LoadLibrary(lpFileName);
if (hModule == IntPtr.Zero)
throw (new Exception(" ));
/// &summary&
/// &/summary&
/// &param name="lpProcName"&
public void LoadFun(string lpProcName)
if (hModule == IntPtr.Zero)
throw (new Exception(" 请确保已进行 LoadDll 操作 !"
farProc = GetProcAddress(hModule, lpProcName);
if (farProc == IntPtr.Zero)
throw (new Exception("
/// &summary&
/// &/summary&
public void UnLoadDll()
FreeLibrary(hModule);
hModule = IntPtr.Z
farProc = IntPtr.Z
/// &summary&
/// &/summary&
/// &param name="ObjArray_Parameter"&
/// &param name="TypeArray_ParameterType"&
/// &param name="ModePassArray_Parameter"&
/// &param name="Type_Return"&
/// &returns&
public object Invoke(object[] ObjArray_Parameter, Type[] TypeArray_ParameterType, ModePass[] ModePassArray_Parameter, Type Type_Return)
// 个 if 是进行安全检查 , 若不能通过 , 则抛出异常
if (hModule == IntPtr.Zero)
throw (new Exception(" 请确保已进行 LoadDll 操作 !"
if (farProc == IntPtr.Zero)
throw (new Exception(" 请确保已进行 LoadFun 操作 !"
if (ObjArray_Parameter.Length != ModePassArray_Parameter.Length)
throw (new Exception("
// 对象并设置其 Name 属性
AssemblyName MyAssemblyName = new AssemblyName();
MyAssemblyName.Name = "InvokeFun";
AssemblyBuilder MyAssemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder MyModuleBuilder = MyAssemblyBuilder.DefineDynamicModule("InvokeDll");
// 方法名为& MyFun &,返回类型是& Type_Return &参数类型是& TypeArray_ParameterType &
MethodBuilder MyMethodBuilder = MyModuleBuilder.DefineGlobalMethod("MyFun", MethodAttributes.Public | MethodAttributes.Static, Type_Return, TypeArray_ParameterType);
// ,用于发送所需的 IL
ILGenerator IL = MyMethodBuilder.GetILGenerator();
for (i = 0; i & ObjArray_Parameter.L i++)
switch (ModePassArray_Parameter[i])
case ModePass.ByValue:
IL.Emit(OpCodes.Ldarg, i);
case ModePass.ByRef:
IL.Emit(OpCodes.Ldarga, i);
throw (new Exception("
if (IntPtr.Size == 4)
IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32());
else if (IntPtr.Size == 8)
IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64());
throw new PlatformNotSupportedException();
IL.EmitCalli(OpCodes.Calli, CallingConvention.StdCall, Type_Return, TypeArray_ParameterType);
IL.Emit(OpCodes.Ret); //
MyModuleBuilder.CreateGlobalFunctions();
MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("MyFun");
return MyMethodInfo.Invoke(null, ObjArray_Parameter);//
2)dld类的使用:
1.&打开项目&Test&,向&Form1&窗体中添加一个按钮,和一个TestBox,Name改为txRet。视图中双击按钮,在&_Click&方法体上面添加代码,创建一个dld类实例,并进行测试。具体如下:
button1_Click(object sender, EventArgs e)
int ret = 0;
dld myDLD = new dld();
myDLD.LoadDll("xxx.dll");
myDLD.LoadFun("InitSDK");
object[] Parameters = new object[] { }; //
Type[] ParameterTypes = new Type[] { }; //
ModePass[] themode = new ModePass[] { }; //
Type Type_Return = typeof(int); //
ret = (int)myDLD.Invoke(Parameters, ParameterTypes, themode, Type_Return);
txRet.Text = ret.ToString();
if (ret != 1)
MessageBox.Show("InitSDK failed !");
if (ret == 1)
MessageBox.Show("InitSDK Sucessed !");
其中,xxx为要测试的dll名称,中的要测试的函数。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:72263次
积分:1274
积分:1274
排名:第13866名
原创:54篇
评论:28条
(3)(3)(1)(1)(1)(2)(1)(2)(1)(1)(1)(2)(1)(4)(1)(2)(1)(4)(1)(1)(2)(6)(4)(8)(6)您所在的位置: &
浅谈C++调用C#的DLL程序方法
浅谈C++调用C#的DLL程序方法
中国IT实验室收集整理
中国IT实验室
本文通过例子,讲述了C++调用C#的DLL程序的方法。作者亲身体会,并作出了以下总结,下面就让我们一起来学习吧。
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL。
SwfDotNet是.net下输出flash的类库。SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目中,怎么让C++调用C#的DLL呢。今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。
接着就是一大堆的0x01等等。自己做了个Sample,仔细分析发现还是自己没有搞清楚。正确的操作如下:
1 创建C# DLL,需要指定应用类型为&类库&,代码:
namespace&CSLib &{ &public&class&Class1 &{ &private&string& &public&string&Name &{ &get &{ &return& &} &set &{ &name&=&\&Your&Name:&\&&+& &} &} &} &} &
2 C++客户程序,是个控制台应用,代码: #using \&..\\debug\\CSLib.dll\&
using&namespace&CSL &int&_tmain(int&argc,&_TCHAR*&argv[]) &{ &Class1&^c&=&gcnew&Class1(); &c-&Name&=&\&zzj\&; &printf(\&%s\\n\&,&c-&Name); &return&0; &} &
3 几点要记住:
1 使用#using引用C# DLL,而不是#include.我就是想当然的使用了后者,所以浪费了一上午的时间;
2 别忘了using namespace CSLib;
3 使用C++/clr语法,采用正确的访问托管对象,即:使用帽子&^&,而不是星星&*&。
以上是怎么调用的总结和几点需要注意的东西。对于C++调用C#的DLL程序可能还有其他的方法,仅供参考。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&&&的更多文章
《C#开发Android应用实战――使用Mono for Android和.NET/C# 全
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
在过去的近十年的时间里,面向对象编程大行其道。以至
很久很久以前,冬天爱上了夏天,可是他们始终不能相见
流火过,金秋来,在学校开学之前的最后一周,终于凉快
本书是针对全国计算机技术与软件专业技术资格(水平)考试而编写的,书中详尽分析与解答了2006年上半年的程序员级、软件设计师级
51CTO旗下网站c++程序调用c#dll,该怎么解决_g++编译不过的模板成员初始化,该如何解决_iis7 http error 500.0,该怎么解决__脚本百事通
稍等,加载中……
^_^请注意,有可能下面的2篇文章才是您想要的内容:
c++程序调用c#dll,该怎么解决
g++编译不过的模板成员初始化,该如何解决
iis7 http error 500.0,该怎么解决
c++程序调用c#dll,该怎么解决
c++程序调用c#dll一、在VS2010中,C#编写DLL并使用C++调用
(1)C#编写DLL程序
建立C#编写的DLL程序 AddDll,
&1&项目类型为:类库
程序代码:
using System.Collections.G
using System.T
namespace AddDll
public class Add
//类必须为public
public int iadd(int a, int b)
//方法也必须为public
int c = a +
(2)C++编写调用程序
建立C++的 Win32控制台应用程序UseDll,
&1&项目类型为:Win32控制台应用程序.
&2&配置:右键点击解决方案资源管理器中的 UseDll,选择“属性”,将公共语
言运行库支持设置为“公共语言运行库支持(/clr)”
程序代码:
#include "stdafx.h"
#include "stdio.h"
#using "..\AddDll\bin\Debug\AddDll.dll"
//注意,要让程序找到dll文件
using namespace AddD
int _tmain(int argc, _TCHAR* argv[])
Add ^add = gcnew Add();
//注意此处的托管指针
result = add-&iadd(10,90);
printf("%d",result);
scanf("%s");
为什么会报以下错误:
------解决方案--------------------为C++项目添加AddDll.dll的引用:
1. 右键C++项目,选择引用(Reference)。
2. 添加新引用(AddNewReference),找到AddDll.dll
g++编译不过的模板成员初始化,该如何解决
g++编译不过的模板成员初始化template&class T&
class BinaryHeap
BinaryHeap(int MaxSize)
_Heap.assign(MaxSize + 1, 0);
class AStar
BinaryHeap&PathNode& _binaryH
AStar::AStar(int szMaxNodes/* = 50000 */)
:_binaryHeap(szMaxNodes)
}gcc报错.vs编译通过
/usr/include/c++/4.4/bits/stl_vector.h: In member function ‘void std::vector&_Tp, _Alloc&::_M_assign_dispatch(_Integer, _Integer, std::__true_type) [with _Integer = int, _Tp = PathNode*, _Alloc = std::allocator&PathNode*&]’:
/usr/include/c++/4.4/bits/stl_vector.h:395:
instantiated from ‘void std::vector&_Tp, _Alloc&::assign(_InputIterator, _InputIterator) [with _InputIterator = int, _Tp = PathNode*, _Alloc = std::allocator&PathNode*&]’
../PriorityQueue.h:81:
instantiated from ‘BinaryHeap&T&::BinaryHeap(int) [with T = PathNode]’
../AStar.cpp:38:
instantiated from here
/usr/include/c++/4.4/bits/stl_vector.h:1051: error: invalid conversion from ‘int’ to ‘PathNode*’
/usr/include/c++/4.4/bits/stl_vector.h:1051: error:
initializing argument 2 of ‘void std::vector&_Tp, _Alloc&::_M_fill_assign(size_t, const _Tp&) [with _Tp = PathNode*, _Alloc = std::allocator&PathNode*&]’
------解决方案--------------------貌似楼主的代码不完整啊!代码里没有vector?------解决方案--------------------参数传错了???
iis7 http error 500.0,该怎么解决
iis7 http error 500.0。net程序在,自己本机iis部署没有问题 ,不到服务其上 提示 HTTP Error 500.0 - Internal Server Error
提示可能原因如下 求帮助
however, an internal error occurred during the processing of the request. The root cause of this error depends on which module handles the request and what was happening in the worker process when this error occurred.
oIIS was not able to access the web.config file for the Web site or application. This can occur if the NTFS permissions are set incorrectly.
oIIS was not able to process configuration for the Web site or application.
oThe authenticated user does not have permission to use this DLL.
oThe request is mapped to a managed handler but the .NET Extensibility Feature is not installed.------解决方案--------------------百度一下吧------解决方案--------------------搜搜错误码,最好使用规范流程重新配置,注意文件读写权限和执行权限以及NET版本
如果您想提高自己的技术水平,欢迎加入本站官方1号QQ群:&&,&&2号QQ群:,在群里结识技术精英和交流技术^_^
本站联系邮箱:c#调用含多个类的c++dll_百度知道
c#调用含多个类的c++dll
c#调用含多个类的dll,调用多个类的dll,使用其中一个类中的方法,如何调用??
提问者采纳
直接的可能没有办法,如果有c++的源码,看能不能编译为托管dll或是用c++写一批辅助函数调用源dll中的类,然后使用p/invoke进行调用或是使用com包装c++的类,然后在c#中进行调用。如果有代码的话,这个方法可能会更快一些。
提问者评价
其他类似问题
按默认排序
其他1条回答
using System.Runtime.InteropS然后按照用Windows API的方法来调用不过最好把DLL改写成标准形式对了
如果是C++ CLI的话可以直接添加引用
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 vb如何调用dll 的文章

 

随机推荐