Fra*_* Q. 4 c# c++ pinvoke interop marshalling
这是我在C++ DLL中的结构和功能
struct Address
{
TCHAR* szAddress;
};
extern "C" DllExport void SetAddress(Address* addr);
Run Code Online (Sandbox Code Playgroud)
从C#我想通过传递地址结构来调用这个API.所以,我在C#中有以下内容
[StructLayout(LayoutKind.Sequential)]
public struct Address
{
[MarshalAs(UnmanagedType.LPTStr)]
public String addressName;
}
[DllImport("Sample.dll")]
extern static void SetAddress(IntPtr addr);
Run Code Online (Sandbox Code Playgroud)
现在,这是我从C#调用C++ API的方式
Address addr = new Address();
addr.addressName = "Some Address";
IntPtr pAddr = Marshal.AllocHGlobal(Marshal.SizeOf(addr));
Marshal.StructureToPtr(addr , pAddr , false);
SetAddress(pAddr); //CALLING HERE
Run Code Online (Sandbox Code Playgroud)
我在C++代码中为Address.szAddress获取NULL.知道这里出了什么问题吗?
你可以简单地传递Address结构ref.您还需要确保调用约定匹配.它看起来好像是本机代码cdecl.最后,UnmanagedType.LPTStr表示Win9x上的ANSI和其他地方的Unicode.因此,如果本机代码需要UTF-16字符串,那么这是合适的.如果它期望ANSI然后使用UnmanagedType.LPStr.
此代码正常工作,本地代码接收C#代码中指定的字符串.
[StructLayout(LayoutKind.Sequential)]
public struct Address
{
[MarshalAs(UnmanagedType.LPTStr)]
public string addressName;
}
[DllImport(@"test.dll", CallingConvention=CallingConvention.Cdecl)]
extern static void SetAddress(ref Address addr);
static void Main(string[] args)
{
Address addr;
addr.addressName = "boo";
SetAddress(ref addr);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4775 次 |
| 最近记录: |