Unity C# 调用C++ dll 问题集锦

1.调用约定

stdcall 、 cdecl、 fastcall等等

这个用来指定参数传递顺序和函数返回时栈的清除方式。

可以通过以下

[AttributeUsage(AttributeTargets.Method)]
  public class DllImportAttribute: System.Attribute
  {
   public DllImportAttribute(string dllName) {…} //定位参数为dllName
   public CallingConvention CallingConvention; //入口点调用约定
   public CharSet CharSet; //入口点采用的字符接
   public string EntryPoint; //入口点名称
   public bool ExactSpelling; //是否必须与指示的入口点拼写完全一致,默认false
   public bool PreserveSig; //方法的签名是被保留还是被转换
   public bool SetLastError; //FindLastError方法的返回值保存在这里
   public string Value { get {…} }
  }

属性指定调用约定和字符集等等。

2.开启x64支持

这个很容易更改,vs正常是win32 release、debug,可以新建x64 release、debug即可。

3.基本数据类型的传递

互调过程中,最基本要传递的无非是数值和字符,即:int,long,float,char等等,但是此类型非彼类型,C/C++与C#中有一些数据类型长度是不一样的,下表中列出常见数据类型的异同:


C/C++


C#


长度


short


short


2Bytes


int


int


4Bytes


long(该类型在传递的时候常常会弄混)


int


4Bytes


bool


bool


1Byte


char(Ascii码字符)


byte


1Byte


wchar_t(Unicode字符,该类型与C#中的Char兼容)


char


2Bytes


float


float


4Bytes


double


double


8Bytes

最容易弄混的是就是long,char两个类型,在C/C++中long和int都是4个字节,都对应着C#中的int类型,而C/C++中的char类型占一个字节,用来表示一个ASCII码字符,在C#中能够表示一个字节的是byte类型。与C#中char类型对应的应该是C/C++中的wchar_t类型,对应的是一个2字节的Unicode字符。

温馨提示,C++的char不是C#的char,这两个类型不兼容的。并且wchar_t 在windows下2byte,在linux下4byte。

4.传递数组

----------------------------------------------------------

C#声明形参如下:

char[] chs

C++声明形参如下:

char chs[5]

此时数组时拷贝过去的,C++修改数组不会改变C#数组

----------------------------------------------------------

C#声明形参如下:

([In, Out][MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] char[] chs

C++声明形参如下:

wchar_t* chs

此时相当于按引用传递,C++修改数组会改变C#数组

----------------------------------------------------------

C#声明形参如下:

ref char ch(调用时,ref char[0])

C++声明形参如下:

wchar_t* chs

此时相当于按引用传递,C++修改数组会改变C#数组

------------------------------------------------------------

如果需要使用指针,可能需要开启unsafe。

5.开启unsafe

Unity3d中C#使用指针(Unsafe)的办法

近日由于在U3D项目中要使用到数据传递(C++ DLL的数据传递给U3D中的C#),其中涉及到需要使用C#的指针。直接编译会出现以下错误Unsafe code requires the ‘unsafe‘ command line option to be specified。

下面是我总结的解决办法:

1.去除MONO编辑器中的Unsafe错误,Assembly-CSharp鼠标右键 找到Options->Build->General 。Allow ‘unsafe‘ code 打钩。这个只能去除MONO报错,但是依然无法运行。

2.首先看下面一段比较长的

Custom Preprocessor Directives

It is also possible to define your own preprocessor directives to control which code gets included when compiling. To do this you must add in the "Assets/" folder a text file with the extra directives. The name of the file depends on the language you are
using :

C# <Project Path>/Assets/smcs.rsp
C# - Editor Scripts <Project Path>/Assets/gmcs.rsp
UnityScript <Project Path>/Assets/us.rsp
Boo <Project Path>/Assets/boo.rsp

As an example, if you include the single line ‘-define:UNITY_DEBUG‘ in your smcs.rsp file the define UNITY_DEBUG will exist as a global define for C# scripts, except for Editor scripts.

Every time you make make changes to the .rsp files a recompilation needs to be done for them to be effective. You can do this by updating or reimporting a single script (.js, .cs or .boo) file.

The usage of the .rsp files is described in the help of the smcs application, included in the Editor installation folder. You can get more information by running : "smcs -help".

在你的Assets目录下面添加smcs.rsp文件,里面只加一行字不要有空格  -unsafe。 OK搞定。记得一定要重启Unity3d, 因为这个预编译是在启动U3D时候运行的。工程文件名别带中文。

原理是编辑器中的smcs.exe 添加编译命令,也可以在CMD下运行编辑器目录下的smcs.exe  逐个添加,会很累的。

引用:

[1] C#与C/C++的交互 http://www.cnblogs.com/warensoft/archive/2011/12/09/warenosoft3d.html

[2] C#_DllImport用法和路径问题 http://www.cnblogs.com/szytwo/archive/2011/12/11/2283780.html

[3] Unity3d中C#使用指针(Unsafe)的办法 http://www.j2megame.com/html/xwzx/ty/3652.html

[4]Unity3D教程:调用C++的DLL方法 http://www.unitymanual.com/5291.html

[5] 数组MARSHALLING

http://www.kycis.com/blog/read.php?21

时间: 2024-11-13 18:45:09

Unity C# 调用C++ dll 问题集锦的相关文章

Unity 4.x游戏开发技巧集锦第2章摄像机的应用

Unity 4.x游戏开发技巧集锦第2章摄像机的应用 作为游戏开发者,千万不要忽略了摄像机(Camera)的重要性.毕竟玩家是通过摄像机,才看到了游戏的视图.本章将介绍一些摄像机的常见应用.本文选自<Unity 4.x游戏开发技巧集锦> Unity 4.x游戏开发技巧集锦2.1  设置双游戏视图 很多游戏里,一个游戏的视图中,经常会包含另一个游戏视图.而两个视图所呈现的,是由两个摄像机在场景的不同位置所拍摄的画面.例如,<QQ飞车>中,除了第三人称视图以外,游戏视图的右侧还有一个跑

Unity3d 调用C++ DLL (Win平台)

Unity3d提供了功能可以让我们自己用各种语言编写 Plugin 来在Unity中使用,官方有简单的文档介绍 http://docs.unity3d.com/Manual/30_search.html?q=dllimport 之前的博文介绍了在 Android 平台使用C++ Plugin. http://blog.csdn.net/huutu/article/details/43602659 本文在Win平台使用C++ DLL. 转自http://blog.csdn.net/huutu ht

C# 调用win32 DLL报错 System.BadImageFormatException

C# 调用win32 DLL报错  System.BadImageFormatException 项目右键属性->项目设计器->生成->平台->把'默认设置(任何 CPU)'改为x86. 因为'任何 CPU'的程序在64位的机器上就会用运行为64位,而64程序是不能加载32位dll的

JNI java调用动态链接库dll

现在做的项目中就用到了JNI调用c语言实现的访问设备的dll文件,在此之前对JNI是一窍不通哈,只听说过JNA链接dll,但只是一个了解. JNI(Java Native Interface)Java本地接口,主要作用是实现java代码与C C++编写的代码交互. 理论不多说,还是看java链接dll具体操作吧..如下: 以下实例为java中调用connection.dll文件中的 open()方法. 1,java方 1)装载dll文件 有两种方式System.load();和System.lo

C# 调用第三方DLL z

http://blog.163.com/[email protected]/blog/static/104072678201311721326318/ 以下代码为本人在实际项目中编写的调用第三方DLL接口程序的完整代码. public class ExecuteDLL : Form { ...//忽略与调用DLL无关的代码 private IntPtr hModule = IntPtr.Zero; /// <summary> /// 调用HIS系统提供的DLL接口程序查看检查申请单 ///DL

Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数)

上篇   Unity3d 调用C++ DLL (Win平台)  介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式. 转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn 创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中介绍了. 首先,在C#中是没有函数指针的,我们使用 Delegate . 转自http://b

C#调用C++ DLL 文件

说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开始从网上看到觉得挺麻烦的就没有仔细研究,如今看到别人写的文章,感觉也不是多难.下面分享一下: 1.整一个DLL 使用C++创建一个动态库项目,应用程序设置中选择“DLL” 打开CPPDemo.cpp文件,添加如下代码 #include "stdafx.h"extern "C&qu

针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码。

Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添加新的视图,最后由开发者自行打包生成IPA包,发布程序.而Unity for Android打包直接生成APK包,等于说源代码开发者是看不到的,但是Unity的自身确实有些局限,针对Android平台我们需要学习如何在Unity中调用Android的JAVA代码.本章我们的目标是使用Unity的脚本打开Activity.首先我们创建一个普通的Android

Atitit.java&#160;jna&#160;调用c++&#160;dll&#160;的总结

Atitit.java jna 调用c++ dll 的总结 1. JNA技术解密1 1.1. JNA工作原理1 2. JNA技术难点 Java—C和操作系统数据类型的对应表1 2.1. 1 2.2. JNA编程过程3 2.2.1. 跨平台.跨语言调用的第一原则:就是尽量使用基本.简单的数据类型,尽量少跨语言.平台传递数据!4 3. 参考4 1. JNA技术解密 1.1. JNA工作原理 JNA是建立在JNI技术基础之上的一个Java类库,它使您可以方便地使用java直接访问动态链接库中的函数.