C#调用VC++dll问题

ChinaCompass 2012-01-14 12:49:05
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也可以!之前没有接触过。谢谢!
...全文
190 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
oneleafpz 2012-01-14
  • 打赏
  • 举报
回复
lz,你传给camerIP的值是啥类型的?
ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 saleayas 的回复:]

C# code

[DllImport("..\\lib\\SDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int IPC_Login(string camerIP, int dataer);
[/Quote]

返回错误信息

尝试读取或写入受保护的内存。这通常指示其他内存已损坏
Saleayas 2012-01-14
  • 打赏
  • 举报
回复

[DllImport("..\\lib\\SDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int IPC_Login(string camerIP, int dataer);

ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chinajiyong 的回复:]
C/C++ code

IPC_Login(char* CamerIP,int dataer);


char * 在C#对应类型string

C# code

IPC_Login(string CamerIP,int dataer);
[/Quote]

你好 经过测试。并非你所说的那样!不过依然表示感谢!谢谢 !
ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zllqjf 的回复:]
C#里有提供一个专门用于平台指针调用的类型 Inptr 再用System.Runtime.InteropServices.Marshal类的方法进行转换,例如:

C# code
[System.Runtime.InteropServices.DllImport("Encrypt1.dll", CharSet = System.Runtime.InteropServices.CharSet.……
[/Quote]

谢谢 这个曾经还真的没有用过!真的感谢 !
ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chinajiyong 的回复:]
C/C++ code

IPC_Login(char* CamerIP,int dataer);


char * 在C#对应类型string

C# code

IPC_Login(string CamerIP,int dataer);
[/Quote]

VC++的char*对应的C#中的string吗?
zllqjf 2012-01-14
  • 打赏
  • 举报
回复
C#里有提供一个专门用于平台指针调用的类型 Inptr 再用System.Runtime.InteropServices.Marshal类的方法进行转换,例如:
[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);
ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oneleafpz 的回复:]
LZ,是不是你没有打开unsafe编译的选项?
[/Quote]
这个我启用了呀!这个是必须的!
ChinaCompass 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xx_mm 的回复:]
C# code
IPC_Login(char* CamerIP,int dataer);

你在调用该方法的时候需要在unsafe方法中:
例如我P/Invoke:

C# code
[DllImport("kernel32.dll")]
internal static extern unsafe int WideCharToMultiByte(uint cp, ……
[/Quote]

谢谢 指导!
蔡袅 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oneleafpz 的回复:]

LZ,是不是你没有打开unsafe编译的选项?
[/Quote]这个必须启用。
EnForGrass 2012-01-14
  • 打赏
  • 举报
回复

IPC_Login(char* CamerIP,int dataer);

char * 在C#对应类型string

IPC_Login(string CamerIP,int dataer);
oneleafpz 2012-01-14
  • 打赏
  • 举报
回复
LZ,是不是你没有打开unsafe编译的选项?
蔡袅 2012-01-14
  • 打赏
  • 举报
回复
IPC_Login(char* CamerIP,int dataer);

你在调用该方法的时候需要在unsafe方法中:
例如我P/Invoke:
 [DllImport("kernel32.dll")]
internal static extern unsafe int WideCharToMultiByte(uint cp, uint flags, char* pwzSource, int cchSource, byte* pbDestBuffer, int cbDestBuffer, IntPtr null1, IntPtr null2);

Call时的Code是:
private unsafe int GetAnsiByteCount()
{
int num3;
uint flags = 0x400;
uint num2 = 0x3f;
byte* pointer = null;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
this.m_buffer.AcquirePointer(ref pointer);
num3 = Win32Native.WideCharToMultiByte(0, flags, (char*) pointer, this.m_length, null, 0, IntPtr.Zero, new IntPtr((void*) &num2));
}
finally
{
if (pointer != null) this.m_buffer.ReleasePointer();
}
return num3;
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧