A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 陈君 金牌黑马   /  2014-8-17 18:11  /  1243 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

转自:http://www.jb51.net/article/42514.htm
c#在调用c++方法或者window api时不能象调用c#本身写的dll类库那样直接通过引用dll就可以调用相应的方法, 而是要把要引用的dll放到bin中,现通过[DllImport("um_web_client.dll")]引用
例子1如下:

  1. //声明部分
  2. [DllImport("um_web_client.dll")]
  3. private static extern int CheckUserName(string UserName);
  4. //
  5. public static int AuthUserName(string username)
  6. {
  7. if(!IsConnection())
  8. {
  9. StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  10. }
  11. return CheckUserName(username);
  12. }
复制代码

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

声明部分

  1. [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi )]
  2. public class tagPlayerInfoOut
  3. {
  4. public int id;
  5. public String PlayerName;
  6. public int Country;
  7. public int OfficerRace;
  8. public int Level;
  9. public int MilitaryRank;
  10. public int Money;
  11. public int ResourceCount;
  12. public int CityCount;
  13. public int GeneralCount;
  14. public int Credit;
  15. }
  16. [ StructLayout( LayoutKind.Sequential )]
  17. public struct tagPlayerInfoOutEx
  18. {
  19. public int id;
  20. public IntPtr PlayerName;
  21. public int Country;
  22. public int OfficerRace;
  23. public int Level;
  24. public int MilitaryRank;
  25. public int Money;
  26. public int ResourceCount;
  27. public int CityCount;
  28. public int GeneralCount;
  29. public int Credit;
  30. }

  31. [DllImport("um_web_client.dll")]
  32. public static extern int GetPlayerListCs(int maxrows, out int rows, out IntPtr playerlist);
  33. [DllImport("um_web_client.dll")]
  34. public static extern int GetPlayerListCs(int maxrows, out int rows, tagPlayerInfoOutEx** playerlist);
复制代码

方法

  1. public static DataTable UsingMarshal()
  2. {
  3. if(!IsConnection())
  4. {
  5. StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  6. }
  7. DataTable dt = new DataTable();
  8. dt.Columns.Add("id");
  9. dt.Columns.Add("PlayerName");
  10. dt.Columns.Add("Country");
  11. dt.Columns.Add("OfficerRace");
  12. dt.Columns.Add("Level");
  13. dt.Columns.Add("MilitaryRank");
  14. dt.Columns.Add("Money");
  15. dt.Columns.Add("ResourceCount");
  16. dt.Columns.Add("CityCount");
  17. dt.Columns.Add("GeneralCount");
  18. dt.Columns.Add("Credit");
  19. int size = 0;
  20. IntPtr outArray;
  21. GetPlayerListCs(20, out size, out outArray);
  22. tagPlayerInfoOut[] manArray = new tagPlayerInfoOut[size];
  23. IntPtr current = outArray;
  24. //Console.WriteLine("记录数{0}",size);

  25. for( int i = 0; i < size; i++ )
  26. {
  27. manArray[ i ] = new tagPlayerInfoOut();
  28. Marshal.PtrToStructure(current, manArray[i]);
  29. Marshal.DestroyStructure(current, typeof(tagPlayerInfoOut) );
  30. current = (IntPtr)((long)current + Marshal.SizeOf(manArray[i]));
  31. 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});
  32. dt.AcceptChanges();
  33. //Console.WriteLine( "Element {0}: {1} {2}", i, manArray[i].id, manArray[i].PlayerName);
  34. }
  35. Marshal.FreeCoTaskMem(outArray);
  36. return dt;
  37. }
  38. public static unsafe DataTable UsingUnsafe()
  39. {
  40. int size;
  41. if(!IsConnection())
  42. {
  43. StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  44. }
  45. DataTable dt = new DataTable();
  46. dt.Columns.Add("id");
  47. dt.Columns.Add("PlayerName");
  48. dt.Columns.Add("Country");
  49. dt.Columns.Add("OfficerRace");
  50. dt.Columns.Add("Level");
  51. dt.Columns.Add("MilitaryRank");
  52. dt.Columns.Add("Money");
  53. dt.Columns.Add("ResourceCount");
  54. dt.Columns.Add("CityCount");
  55. dt.Columns.Add("GeneralCount");
  56. dt.Columns.Add("Credit");
  57. tagPlayerInfoOutEx* pResult;
  58. GetPlayerListCs(20, out size, &pResult );
  59. tagPlayerInfoOutEx* pCurrent = pResult;
  60. //Console.WriteLine("记录数{0}",size);
  61. for( int i = 0; i < size; i++, pCurrent++ )
  62. {
  63. //Console.WriteLine( "Element {0}: {1} {2}", i, pCurrent->id ,Marshal.PtrToStringAnsi(pCurrent->PlayerName));
  64. //Marshal.FreeCoTaskMem(pCurrent->PlayerName );
  65. 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});
  66. dt.AcceptChanges();
  67. }
  68. Marshal.FreeCoTaskMem((IntPtr)pResult );
  69. return dt;
  70. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马