转自:http://www.jb51.net/article/42514.htm
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:
声明部分
但是如果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;
- }
复制代码
|
|