如何调用从C#C函数与WCHAR * out参数?(how to call a C function

2019-07-30 21:20发布

我有一点问题,编组,我只是不能由我自己看着办吧。 我搜索过这个话题,但并未有任何运气还没有,所以基本上我想从我的托管C#应用程序调用非托管的C函数。 C函数的签名如下所示:

long MyFunction(WCHAR* upn, long upnSize, WCHAR* guid, long* guidSize);

我不访问该.dll文件,我只知道函数被曝光的使用,我知道什么功能是应该做的,但我不知道里面有什么情况发生,所以函数接收WCHAR * UPN拿着UserPricipalName和与所提供的UPN的长度长。 还一个WCHAR指针传递沿,其中,函数写回其与传递UPN相关联的相应的GUID。 该guidSize指针供应指针的大小,如果它太小书面GUID没有完全写入。 如果一切顺利的函数应返回0(它从来没有发生过,从C#调用时)

现在,我的努力来调用和调用这个函数是这样的:

[DllImport(@"MyDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern long MyFunction(IntPtr upnPtr, long upnSize, [Out, MarshalAsAttribute(UnmanagedType.LPWStr) ] StringBuilder guidPtr, IntPtr guidSizePtr);


//my attempt to call the Dll's exposed function
string upn = foo@bar.com;
long upnSize = upn.Length;
IntPtr upnPtr = Marshal.StringToHGlobalUni(upn);

IntPtr guidSizePtr = Marshal.AllocHGlobal(sizeof(long));
Marshal.WriteInt32(GuidSizePtr, 128);
var guidSB = new StringBuilder(128);

result = MyFunction(upnPtr, upnSize, guidSB, guidSizePtr);

结果我收到一个AccessViolationException。 我打得周围的许多变化来调用函数,但我从来没有成功地接收到0的返回值,我从来没有能够读出的GUID,因为我应该做的。

任何帮助,将不胜感激。

Answer 1:

声明函数为:

    [DllImport(@"MyDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
    public static extern int MyFunction([MarshalAsAttribute(UnmanagedType.LPWStr)] string upnPtr, int upnSize, [MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder guidPtr, ref int guidSizePtr);

说它如下:

        string upn = "foo@bar.com";
        var guidSB = new StringBuilder(128);
        int guidSizePtr =guidSB.Capacity;
        MyFunction(upn, upn.Length, guidSB, ref guidSizePtr);

请注意,长期在C ++是32位的,所以你应该定义所有这些情况在你的C#代码INT。



文章来源: how to call a C function from C# with a WCHAR* out parameter?