我想从我的托管代码得到一个字符串到我的非托管代码:我怎样才能传递一个空字符串缓冲区,可以从本地写入到C#?
非托管的DLL:
typedef int (__stdcall * GetNameFromDictionaryCallback)(ULONGLONG id, WCHAR * name);
declspec(dllexport) void __stdcall UnmanagedSetNameLookupCallback(GetNameFromDictionaryCallback fn)
{
GetNameFromDictionaryCallback GetNameFromDictionary = fn;
WCHAR * value = new WCHAR[256];
ULONGLONG key = 0x250000000DA44785;
GetNameFromDictionary(key, value); // reverse P/Invoke call to C# function
wprintf_s("%ls", value); // just to display the result for simplicity
delete value;
}
管理DLL:
public class ProgramInterop
{
private delegate int GetNameFromDictionaryCallback(UInt64 key, string value);
private static GetNameFromDictionaryCallback mGetNameInstance;
private Dictionary<UInt64, string> dict;
private ProgramInterop()
{
mGetNameInstance = new GetNameFromDictionaryCallback(GetNameFromDictionary);
UnmanagedSetNameLookupCallback(mGetNameInstance);
}
public bool GetNameFromDictionary(UInt64 key, string value)
{
return dict.TryGetValue(key, out value);
}
[DllImport("Unmanaged.dll")]
private static extern void UnmanagedSetNameLookupCallback(GetNameFromDictionaryCallback fn);
}
在我的管理程序我的字符串看起来很好,但它变成非托管方的垃圾。我没有复制所有的代码,但我认为这是我想要完成的。如果我以错误的方式去解决这个问题,或者我犯了错误,请告诉我。谢谢。
如果您可以更改回调以使用'BSTR',则可以在此问题中使用该解决方案:http://stackoverflow.com/questions/4455234/passing-string-from-c-to-c-sharp – shf301