none
求助,关于C#调用C++时指针问题 RRS feed

  • 问题

  • 大家好,我现在有一个C++(托管的)的函数,原型如下:

    Test::Class1::Class1(const char* username, const char* password)

     

    那么我在C#要是用这个函数怎么办呢?

    我不知道如何将一个数组以指针形式传给这个C++函数,希望各位前辈给予解答。。谢谢

    2010年11月8日 1:55

答案

  • 这里还有篇参考文档 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日 3:33
    版主

全部回复

  • 你好 飞翔

    如果是托管的那么可以直接引用即可

    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
    2010年11月8日 2:25
    版主
  • 这里还有篇参考文档 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日 3:33
    版主
  • 非常感谢你的热心帮助哈。。。。
    2010年11月8日 6:49
  • 非常感谢你的热心帮助哈。。。。

    不用谢 欢迎你经常来msdn论坛~~~

    Raymond Tang (Microsoft C# MVP)
    Denn Ich Gehoer nur mir
    .NET交流群71840452
    微软中文论坛同城社区成都QQ群:74268428
    My Chinese Blog
    Chengdu,Sichuan Province,China
    2010年11月9日 3:26
    版主
  • 我想请教您一个问题,如果C++dll文件中的函数形参有二维整型指针变量(int **)或者更高维整型指针变量,应该怎么调用啊?最近这个问题困扰我好长时间了,谢谢啦!
    2011年4月27日 6:36