积极答复者
求助,关于C#调用C++时指针问题

问题
答案
-
这里还有篇参考文档 http://msdn.microsoft.com/zh-cn/library/68td296t%28v=VS.80%29.aspx
下面我给个例子 我用c++建立托管程序集:
// TestCPP.h #pragma once using namespace System; namespace TestCPP { public ref class Class1 { public: Class1(const char* username,const char* password); }; } // This is the main DLL file. #include "stdafx.h" #include "TestCPP.h" #using <mscorlib.dll> //using namespace System; //using namespace System::IO; namespace TestCPP { Class1::Class1(const char* username,const char* password) { printf(username); printf(password); } }
新建立c#项目添加对生成的C++ dll的引用,需要设置c#项目允许unsafe code
static void Main(string[] args) { unsafe { string username = "name"; string password = "123456"; byte[] uname = Encoding.Default.GetBytes(username); byte[] pwd = Encoding.Default.GetBytes(password); sbyte[] unames = new sbyte[uname.Length]; sbyte[] pwds = new sbyte[pwd.Length]; Buffer.BlockCopy(uname, 0, unames, 0, uname.Length); Buffer.BlockCopy(pwd, 0, pwds, 0, pwd.Length); fixed (sbyte* n = unames) { fixed (sbyte* p = pwds) { TestCPP.Class1 class1 = new TestCPP.Class1(n, p); } } } Console.ReadKey(); }
最终输出:
name123456
Raymond Tang (Microsoft C# MVP)
Denn Ich Gehoer nur mir
.NET交流群71840452
微软中文论坛同城社区成都QQ群:74268428
My Chinese Blog
Chengdu,Sichuan Province,China- 已标记为答案 死亡的飞翔 2010年11月8日 6:48
全部回复
-
你好 飞翔
如果是托管的那么可以直接引用即可
Test.Class1.Class1("username","password");
如果是非托管的
你直接在c#声明char数组类型参数为string即可,比如
[DllImport("Test.dll")]
static extern int Class1(string username,string password);
Raymond Tang (Microsoft C# MVP)
Denn Ich Gehoer nur mir
.NET交流群71840452
微软中文论坛同城社区成都QQ群:74268428
My Chinese Blog
Chengdu,Sichuan Province,China -
这里还有篇参考文档 http://msdn.microsoft.com/zh-cn/library/68td296t%28v=VS.80%29.aspx
下面我给个例子 我用c++建立托管程序集:
// TestCPP.h #pragma once using namespace System; namespace TestCPP { public ref class Class1 { public: Class1(const char* username,const char* password); }; } // This is the main DLL file. #include "stdafx.h" #include "TestCPP.h" #using <mscorlib.dll> //using namespace System; //using namespace System::IO; namespace TestCPP { Class1::Class1(const char* username,const char* password) { printf(username); printf(password); } }
新建立c#项目添加对生成的C++ dll的引用,需要设置c#项目允许unsafe code
static void Main(string[] args) { unsafe { string username = "name"; string password = "123456"; byte[] uname = Encoding.Default.GetBytes(username); byte[] pwd = Encoding.Default.GetBytes(password); sbyte[] unames = new sbyte[uname.Length]; sbyte[] pwds = new sbyte[pwd.Length]; Buffer.BlockCopy(uname, 0, unames, 0, uname.Length); Buffer.BlockCopy(pwd, 0, pwds, 0, pwd.Length); fixed (sbyte* n = unames) { fixed (sbyte* p = pwds) { TestCPP.Class1 class1 = new TestCPP.Class1(n, p); } } } Console.ReadKey(); }
最终输出:
name123456
Raymond Tang (Microsoft C# MVP)
Denn Ich Gehoer nur mir
.NET交流群71840452
微软中文论坛同城社区成都QQ群:74268428
My Chinese Blog
Chengdu,Sichuan Province,China- 已标记为答案 死亡的飞翔 2010年11月8日 6:48
-
非常感谢你的热心帮助哈。。。。
不用谢 欢迎你经常来msdn论坛~~~
Raymond Tang (Microsoft C# MVP)
Denn Ich Gehoer nur mir
.NET交流群71840452
微软中文论坛同城社区成都QQ群:74268428
My Chinese Blog
Chengdu,Sichuan Province,China