user-0 提问: 关于C语言方法参数，给C#调用的问题 

回复:
user: user-1
content: [dllimport]  默认使用 __stdcall 调用约定  c api 默认使用 __cdecl 调用约定.  是不是这个导致的?

user: user-2
content: 如果你需要传 NULL到非托管内存，使用 IntPtr，然后传递 IntPtr.Zero。

user: user-0
content: [DllImport(@"libeaspui.dll")] public static unsafe extern int CI_SymEncrypt(long nFunction, ref  StringBuilder pEntity,  ref  StringBuilder pPlainData, UInt32 nPlainLength,  ref StringBuilder pCipherData, ref  UInt32 pnCipherLength);

user: user-0
content: [DllImport(@"libeaspui.dll")] public static unsafe extern int CI_SymEncrypt(long nFunction, ref  StringBuilder pEntity,  ref  StringBuilder pPlainData, UInt32 nPlainLength,  ref StringBuilder pCipherData, ref  UInt32 pnCipherLength);

user: user-0
content: 这是C的调用示例 #include “Custom_Interface.h” #include “GI_Datatype.h” #define   reciveID  “020000000008”//假设接收方ID为020000000008 #define   sendID  “020000000009”// 假设发送方ID为020000000009 void main() { CI_RV				 rv; unsigned long		 dataLen, encDataLen,newDataLen; unsigned char       data[1024]; //假设明文最大长度为1024个字节 unsigned char       encData[1024+16];//对应最大密文长度为1024+16个字节 unsigned char     newData[1024];//假设解密得到的新明文长度最大为1024个字节  dataLen = 563;//假设加密的数据长度为563个字节 //使用与实体0008共享的第3个对称加密密钥加密将要与实体0008共享的数据。 rv = CI_SymEncrypt( 3, reciveID, data, dataLen,  NULL, &encDataLen);        if(rv != GI_OK)        {             printf(“get cipher length error. Error code is [%08x]\n”,rv);         } }

user: user-2
content: unsigned  char 对应的是 byte。 char *和 wchar_t * 才是字符串。

user: user-0
content: 我看MSN上面的 C函数对应C#数据类型 https://msdn.microsoft.com/zh-cn/library/ac7ay120.aspx unsigned char 好像应该使用 byte ？ 那C 语言 参数名后面*号，是什么意思，对应的是C# ref 参数吗 ？

user: user-0
content: 我把代码改为下面的引用，返回的结果还是一样的     [DllImport(@"libeaspui.dll")] public static unsafe extern int CI_SymEncrypt(long nFunction, ref  StringBuilder pEntity, ref  StringBuilder pPlainData, UInt32 nPlainLength, ref StringBuilder pCipherData, ref  UInt32 pnCipherLength);

user: user-0
content: 我现在情况是：方法调用正常，没有报错，但是根据方法返回的code 得到的含义是 指针参数为NULL！！！ 所以我想问一下 这个是因为C# 参数传递错误造成的么

user: user-3
content: 2 3 5参数类型一样的,为啥到C#那边就不一样了呢?

user: user-4
content: 仅供参考：using System.Runtime.InteropServices;  public class Win32 {      [DllImport("user32.dll", CharSet=CharSet.Auto)]      public static extern IntPtr MessageBox(int hWnd, String text,                       String caption, uint type); }  public class HelloWorld {     public static void Main() {        Win32.MessageBox(0, "Hello World", "Platform Invoke Sample", 0);     } }         ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_fxinterop/html/ccb68ce7-b0e9-4ffb-839d-03b1cd2c1258.htm .NET Framework 开发人员指南  与非托管代码交互操作  发送反馈意见     Microsoft .NET Framework 将促进与 COM 组件、COM+ 服务、外部类型库和许多操作系统服务的互操作。在托管和非托管对象模型之间，数据类型、方法签名和错误处理机制都存在差异。为了简化 .NET Framework 组件和非托管代码之间的互用并便于进行移植，公共语言运行库将从客户端和服务器中隐藏这两种对象模型之间的差异。  在运行库的控制下执行的代码称作托管代码。相反，在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。  本节内容 与非托管代码交互操作帮助主题  提供指向在有关与非托管代码进行互操作的概念性文档中找到的所有帮助主题的链接。  向 .NET Framework 公开 COM 组件  描述如何从基于 .NET 的应用程序使用 COM 组件。  向 COM 公开 .NET Framework 组件  描述如何从 COM 应用程序使用基于 .NET 的组件。  使用非托管 DLL 函数  描述如何使用平台调用来调用非托管的 DLL 函数。  互操作的设计注意事项  提供有关编写集成 COM 组件的提示。  互操作封送处理  描述如何对 COM Interop 和平台调用进行封送处理。  如何：映射 HRESULT 和异常  描述异常和 HRESULT 之间的映射。  使用泛型类型进行交互操作  描述泛型类型在用于 COM interop 时的行为。  相关章节 高级开发技术  提供指向关于 .NET Framework 中的高级开发任务和技术的更多信息的链接。   发送反馈意见，就此主题向 Microsoft 发送反馈意见。