unity中调用dll(char*,以及带有函数指针的参数)方法总结

18 篇文章 2 订阅
dllImport是System.Runtime.InteropServices命名空间下的一个属性类,因此ASP.NET中要使用DllImport的,必须在先using System.Runtime.InteropServices;”。其功能是提供从非托管DLL导出的函数进行调用所必需的信息。DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称。
 
DllImport 属性定义 
如下:
  
namespace System.Runtime.InteropServices
   {
    [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 {...}}                            
    } 
  }

说明:
1、DllImport只能放置在方法声明上。
2、DllImport具有单个定位参数:指定包含被导入方法的 dll 名称的 dllName 参数。
3、DllImport具有五个命名参数:
   a、CallingConvention 参数指示入口点的调用约定。如果未指定CallingConvention,则使用默认值CallingConvention.Winapi。
   b、CharSet参数指定用在入口点的字符集。如果未指定CharSet,则使用默认值CharSet.Auto。
   c、EntryPoint参数给出dll中入口点的名称。如果未指定EntryPoint,则使用方法本身的名称。
   d、ExactSpelling参数指示EntryPoint是否必须与指示的入口点的拼写完全匹配。如果未指定ExactSpelling,则使用默认值false。
   e、PreserveSig参数指示方法的签名被保留还是被转换。当签名被转换时,它被转换为一个具有HRESULT返回值和该返回值的一个名为retval的附加输出参数的签名。如果未指定PreserveSig,则使用默认值true。
   f、SetLastError参数指示方法是否保留Win32“上一错误”。如果未指定SetLastError,则使用默认值false。
4、它是一次性属性类。
5、用DllImport属性修饰的方法必须具有extern修饰符。
 
首先要在Unity中导入相对应得DLL
C++ .h文件
extern "C" __declspec(dllimport) void Creat();

C#文件
 [DllImport("WebrtcClient")]
    public static extern void Creat();
带char* 参数的方法
 
c++.h 文件
extern "C" __declspec(dllimport) void Connect(const char* szConnetId	);

C# 文件
[DllImport("WebrtcClient")]
    public static extern voidConnect([MarshalAs(UnmanagedType.LPStr)]string connetId);
 MarshalAs属性指示如何在托管代码和非托管代码之间封送数据。
如果不加[MarshalAs(UnmanagedType.LPStr)] 在Unity中可能会出现崩溃
 
C++中使用指针是家常便饭了,也非常的好用,但是在C#中就强调托管的概念了,指针就不用想了。下面来看一下带有函数指针的参数的传递
C++.h文件
extern "C" __declspec(dllimport) void CallbackFunc(
	void(*SendMessageCallback)( const char* szMessage)		// IN:回调函数指针
	);
C#文件
[DllImport("WebrtcClient", EntryPoint = "CallbackFunc")]
    public static extern void CallbackFunc(SendMessageFuncCallback sendMsgFunc);//(void(*SendMessageCallback)(const char*));

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void SendMessageFuncCallback([MarshalAs(UnmanagedType.LPStr)]string message);




                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值