日期:2014-05-18  浏览次数:20731 次

C#调用VC++dll问题
C#无法直接引用VC++编译的dll。虽然可以使用DllImport加载调用,但必须进行相应转换。
在dll中有int IPC_Init(int Init)和int IPC_Cleanup();
经过相应的转换后可以调用成功,如下

  [DllImport("..\\lib\\SDK.dll")]
  public static extern int IPC_Init(int Iit);
  [DllImport("..\\lib\\SDK.dll")]
  public static extern int IPC_Cleanup();

出现以指针的方法,转换失败.
IPC_Login(char* CamerIP,int dataer);


在网站也找了一些资料。说指针可以使用ref CamerIP这样可以解决。但经过测试也不行。
C#使用指针要启用非安全代码并且要用unsafe包括住。但几经尝试也失败。或许是思路是错的!
请问如何解决像C#调用VC++使用指针方法。希望大家给点思路或者资料。Demo也可以!之前没有接触过。谢谢!

------解决方案--------------------
C# code
IPC_Login(char* CamerIP,int dataer);

------解决方案--------------------
C/C++ code

IPC_Login(char* CamerIP,int dataer);

------解决方案--------------------
C#里有提供一个专门用于平台指针调用的类型 Inptr 再用System.Runtime.InteropServices.Marshal类的方法进行转换,例如:
C# code
[System.Runtime.InteropServices.DllImport("Encrypt1.dll", CharSet = System.Runtime.InteropServices.CharSet.Ansi, CallingConvention = System.Runtime.InteropServices.CallingConvention.Cdecl)]
        public static extern IntPtr Encode(IntPtr message);//这里相当于C++的char*
string msg = "aksdjfk";
            IntPtr inPtr = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(msg);
            IntPtr outPtr = Common.Encrpty.Encode(inPtr);
            string msg1 = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(outPtr);