Я использовал sqlite для вставки миллионов строк во время выполнения, и это то, что я использовал для повышения производительности:
Если вы попробуете это, пожалуйста, опубликуйте результаты теста. Я верю, что это будет интересно всем.
Я настоятельно рекомендую вам использовать IntPtr и Marshal.Copy. Вот код для начала. memAddr - это адрес памяти, который вам предоставлен, а bufSize - это размер.
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[bufSize];
Marshal.Copy(bufPtr, data, 0, bufSize);
Это не требует от вас использования небезопасного кода, который требует параметра компилятора / unsafe и не может быть проверен CLR.
Если вам нужно массив из чего-то другого, кроме байтов, просто измените вторую строку. Marshal.Copy содержит множество перегрузок.
Вы можете использовать Marshal.Copy для копирования данных из собственного память в управляемый массив. Таким образом, вы можете затем использовать данные в управляемом коде без использования небезопасного кода.
Я думаю, вы ищете тип IntPtr
. Этот тип (при использовании в блоке unsafe
) позволит вам использовать дескриптор памяти из компонента ActiveX.
C # может использовать указатели. Просто используйте ключевое слово unsafe перед своим классом, блоком, методом или переменной-членом (не локальными переменными). Если класс помечен как небезопасный, все переменные-члены также небезопасны.
unsafe class Foo
{
}
unsafe int FooMethod
{
}
Тогда вы можете использовать указатели с * и & точно так же, как C.
Я не знаю о компонентах ActiveX в том же адресном пространстве.