c#调用c++方法介绍,window api

 更新时间:2013年10月29日 09:57:52   作者:  
c#在调用c++方法或者window api时不能象调用c#本身写的dll类库那样直接通过引用dll就可以调用相应的方法, 而是要把要引用的dll放到bin中,现通过[DllImport("um_web_client.dll")]引用

例子1如下:

复制代码 代码如下:

//声明部分

[DllImport("um_web_client.dll")]
  private static extern int CheckUserName(string UserName);

//

public static int AuthUserName(string username)
  {
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   return CheckUserName(username);
  }


但是如果c++方法中用了指针或者结构体等则引用就要注意,相应就要用到引用数组或者指针,例子2:

声明部分

复制代码 代码如下:

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi )]
  public class tagPlayerInfoOut
  {
   public int id;
   public String PlayerName;
   public int Country;
   public int OfficerRace;
   public int Level;
   public int MilitaryRank;
   public int Money;
   public int ResourceCount;
   public int CityCount;
   public int GeneralCount;
   public int Credit;
  }

  [ StructLayout( LayoutKind.Sequential )]
  public struct tagPlayerInfoOutEx
  {
   public int id;
   public IntPtr PlayerName;
   public int Country;
   public int OfficerRace;
   public int Level;
   public int MilitaryRank;
   public int Money;
   public int ResourceCount;
   public int CityCount;
   public int GeneralCount;
   public int Credit;
  }

 

[DllImport("um_web_client.dll")]
  public static extern int GetPlayerListCs(int maxrows, out int rows,  out IntPtr playerlist);

  [DllImport("um_web_client.dll")]
  public static extern int GetPlayerListCs(int maxrows, out int rows, tagPlayerInfoOutEx** playerlist);


方法
复制代码 代码如下:

public static DataTable UsingMarshal()
  {
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   DataTable dt = new DataTable();

   dt.Columns.Add("id");
   dt.Columns.Add("PlayerName");
   dt.Columns.Add("Country");
   dt.Columns.Add("OfficerRace");
   dt.Columns.Add("Level");
   dt.Columns.Add("MilitaryRank");
   dt.Columns.Add("Money");
   dt.Columns.Add("ResourceCount");
   dt.Columns.Add("CityCount");
   dt.Columns.Add("GeneralCount");
   dt.Columns.Add("Credit");

   int size = 0;
   IntPtr outArray;
   GetPlayerListCs(20, out size, out outArray);
   tagPlayerInfoOut[] manArray = new tagPlayerInfoOut[size];
   IntPtr current = outArray;
   //Console.WriteLine("记录数{0}",size);

   for( int i = 0; i < size; i++ )
   {
    manArray[ i ] = new tagPlayerInfoOut();
    Marshal.PtrToStructure(current, manArray[i]);
    Marshal.DestroyStructure(current, typeof(tagPlayerInfoOut) );
    current = (IntPtr)((long)current + Marshal.SizeOf(manArray[i]));

    dt.Rows.Add(new object[] {manArray[i].id,manArray[i].PlayerName,manArray[i].Country,manArray[i].OfficerRace,manArray[i].Level,manArray[i].MilitaryRank,manArray[i].Money,manArray[i].ResourceCount,manArray[i].CityCount,manArray[i].GeneralCount,manArray[i].Credit});

    dt.AcceptChanges();
   //Console.WriteLine( "Element {0}: {1} {2}", i, manArray[i].id, manArray[i].PlayerName);
  }
   Marshal.FreeCoTaskMem(outArray);
   return dt;
  }

  public static unsafe DataTable UsingUnsafe()
  {
   int size;
   if(!IsConnection())
   {
    StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
   }
   DataTable dt = new DataTable();

   dt.Columns.Add("id");
   dt.Columns.Add("PlayerName");
   dt.Columns.Add("Country");
   dt.Columns.Add("OfficerRace");
   dt.Columns.Add("Level");
   dt.Columns.Add("MilitaryRank");
   dt.Columns.Add("Money");
   dt.Columns.Add("ResourceCount");
   dt.Columns.Add("CityCount");
   dt.Columns.Add("GeneralCount");
   dt.Columns.Add("Credit");
   tagPlayerInfoOutEx* pResult;
   GetPlayerListCs(20,  out size, &pResult );
   tagPlayerInfoOutEx* pCurrent = pResult;
   //Console.WriteLine("记录数{0}",size);

   for( int i = 0; i < size; i++, pCurrent++ )
   {
    //Console.WriteLine( "Element {0}: {1} {2}", i, pCurrent->id ,Marshal.PtrToStringAnsi(pCurrent->PlayerName));
    //Marshal.FreeCoTaskMem(pCurrent->PlayerName );
    dt.Rows.Add(new object[] {pCurrent->id,pCurrent->PlayerName,pCurrent->Country,pCurrent->OfficerRace,pCurrent->Level,pCurrent->MilitaryRank,pCurrent->Money,pCurrent->ResourceCount,pCurrent->CityCount,pCurrent->GeneralCount,pCurrent->Credit});

    dt.AcceptChanges();
   }
   Marshal.FreeCoTaskMem((IntPtr)pResult );
   return dt;
  }

相关文章

  • C#实现设置电脑显示器参数

    C#实现设置电脑显示器参数

    这篇文章主要为大家详细介绍了如何利用C#实现设置电脑显示器参数,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • C#判断单词个数方法总结

    C#判断单词个数方法总结

    我们给大家总计了C#中判断英文单词个数的方法以及排序的技巧,对此有需要的朋友可以测试下。
    2018-03-03
  • Unity实现背景图片淡入淡出效果

    Unity实现背景图片淡入淡出效果

    这篇文章主要为大家详细介绍了Unity实现背景图片淡入淡出,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Unity实现截屏以及根据相机画面截图

    Unity实现截屏以及根据相机画面截图

    这篇文章主要为大家详细介绍了Unity实现截屏以及根据相机画面截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#如何取硬件标志

    C#如何取硬件标志

    C#如何取硬件标志...
    2007-03-03
  • 利用Unity制作特写镜头的示例代码

    利用Unity制作特写镜头的示例代码

    这篇文章主要介绍了如何利用Unity制作特写镜头效果,文中的示例代码讲解详细,对我们学习有一定的参考价值,感兴趣的可以了解一下
    2022-04-04
  • C#获取系统当前IE版本号

    C#获取系统当前IE版本号

    这篇文章主要为大家详细介绍了C#获取系统当前IE版本号,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类

    轻松学习C#的ArrayList类,对C#的ArrayList类感兴趣的朋友可以参考本篇文章,帮助大家更灵活的运用C#的ArrayList类
    2015-11-11
  • C#实现简易点餐功能

    C#实现简易点餐功能

    这篇文章主要为大家详细介绍了C#实现简易点餐功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C# 获取文件夹里所有文件名的详细代码

    C# 获取文件夹里所有文件名的详细代码

    这篇文章主要介绍了C# 获取文件夹里所有文件名,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08

最新评论