zl程序教程

您现在的位置是:首页 >  后端

当前栏目

c#调用c++方法介绍,windowapi

c#C++方法 介绍 调用
2023-06-13 09:15:07 时间

例子1如下:

复制代码代码如下:

//声明部分

[DllImport("um_web_client.dll")]
 privatestaticexternintCheckUserName(stringUserName);

//

publicstaticintAuthUserName(stringusername)
 {
  if(!IsConnection())
  {
   StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  }
  returnCheckUserName(username);
 }


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

声明部分

复制代码代码如下:

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
 publicclasstagPlayerInfoOut
 {
  publicintid;
  publicStringPlayerName;
  publicintCountry;
  publicintOfficerRace;
  publicintLevel;
  publicintMilitaryRank;
  publicintMoney;
  publicintResourceCount;
  publicintCityCount;
  publicintGeneralCount;
  publicintCredit;
 }

 [StructLayout(LayoutKind.Sequential)]
 publicstructtagPlayerInfoOutEx
 {
  publicintid;
  publicIntPtrPlayerName;
  publicintCountry;
  publicintOfficerRace;
  publicintLevel;
  publicintMilitaryRank;
  publicintMoney;
  publicintResourceCount;
  publicintCityCount;
  publicintGeneralCount;
  publicintCredit;
 }

 

[DllImport("um_web_client.dll")]
 publicstaticexternintGetPlayerListCs(intmaxrows,outintrows, outIntPtrplayerlist);

 [DllImport("um_web_client.dll")]
 publicstaticexternintGetPlayerListCs(intmaxrows,outintrows,tagPlayerInfoOutEx**playerlist);


方法
复制代码代码如下:
publicstaticDataTableUsingMarshal()
 {
  if(!IsConnection())
  {
   StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  }
  DataTabledt=newDataTable();

  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");

  intsize=0;
  IntPtroutArray;
  GetPlayerListCs(20,outsize,outoutArray);
  tagPlayerInfoOut[]manArray=newtagPlayerInfoOut[size];
  IntPtrcurrent=outArray;
  //Console.WriteLine("记录数{0}",size);

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

   dt.Rows.Add(newobject[]{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);
  returndt;
 }

 publicstaticunsafeDataTableUsingUnsafe()
 {
  intsize;
  if(!IsConnection())
  {
   StartWebClient(UDBClientIP,UDBClientPort,UDBClientTimeout);
  }
  DataTabledt=newDataTable();

  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, outsize,&pResult);
  tagPlayerInfoOutEx*pCurrent=pResult;
  //Console.WriteLine("记录数{0}",size);

  for(inti=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(newobject[]{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);
  returndt;
 }