如何使用 WCHAR* out 参数从 C# 调用 C 函数



我在封送方面遇到了一些问题,我自己无法弄清楚。我已经搜索了这个主题,但还没有运气,所以基本上我正在尝试从我的托管 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);

因此,我收到访问违规异常。我已经尝试了许多变体来调用该函数,但我从未设法接收 0 作为返回值,并且我永远无法像我应该做的那样读出 GUID。

任何这方面的帮助将不胜感激。

将函数声明为:

    [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);

请注意,长 in C++ 是 32 位,因此应在 C# 代码中将所有此类实例定义为 int。

最新更新