Мое чтение вашего вопроса заставляет меня думать, что вы спрашиваете:
Как мне создать функции, которые имитируют собственный вызов, который я делаю, который возвращает IntPtr в строку типа double или unicode, чтобы я мог передать этот IntPtr функциям, которые я хочу протестировать?
Как-то так может помочь:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
private static double myDouble = 3.14;
private static unsafe void TestPtrToDouble()
{
fixed(double* pDouble = &myDouble)
{
IntPtr intp = new IntPtr(pDouble);
double[] copy = new double[1];
Marshal.Copy(intp, copy, 0, 1);
Debug.Assert(copy[0] == myDouble);
}
}
private static char[] myString = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };
private static unsafe void TestPtrToUnicodeString()
{
fixed (char* pChar = &myString[0])
{
IntPtr intp = new IntPtr(pChar);
string copy = Marshal.PtrToStringUni(intp);
Debug.Assert(copy == "This is my string");
}
}
static void Main(string[] args)
{
TestPtrToUnicodeString();
TestPtrToDouble();
}
}
}
Следует помнить, что вы не сможете вернуть фиктивный IntPtr, созданный из функции. Т.е. вы не можете создать поддельную версию ваших вызовов P / Invoke и ожидать, что все будет работать.
Среда выполнения .Net перемещает управляемые объекты в памяти (часть процесса сбора мусора). Оператор fixed
не позволяет этому произойти для члена / объекта, адрес которого вы берете. Но только на всю жизнь блока. Блок заканчивается, если вы возвращаетесь из функции, поэтому значение указателя может быть недействительным после возврата. Т.е. ваш IntPtr может ссылаться на память, которая больше не содержит данных, которые вы хотите упорядочить.
Ознакомьтесь с документацией MSDN по небезопасному коду и фиксированному оператору . Но то, что у меня есть, должно направить вас в правильном направлении для создания теста NUnit для вашего кода маршалинга.
Также обратите внимание, что этот код требует компиляции с параметром / unsafe. Если вам нужно, чтобы ваша сборка работала в среде, которая не поддерживает небезопасные сборки, вам понадобится тестовый код в другой сборке. Но так как вы уже используете P / Invoke, я думаю, что это не так.