Можно ли на Python получить массив строк переменной длины из C#?
Это может быть красная сельдь, но моя версия без массива выглядит так:
C#
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace Blah
{
public static class Program
{
[DllExport("printstring", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.AnsiBStr)]
public static string PrintString()
{
return "Hello world";
}
}
}
питон
import ctypes
dll = ctypes.cdll.LoadLibrary(“test.dll")
dll.printstring.restype = ctypes.c_char_p
dll.printstring()
Я ищу printstrings
который принес бы List<string>
переменного размера. Если это невозможно, я соглашусь на фиксированную длину string[]
,
1 ответ
.NET способен трансформировать object
введите в COM автоматизации VARIANT
и наоборот, когда вы проходите через слой p/invoke.
ВАРИАНТ объявлен в питоне automation.py
что идет с comtypes
,
Что классно с VARIANT - это обертка, которая может хранить много вещей, включая массивы многих вещей.
Имея это в виду, вы можете объявить свой код.NET C# следующим образом:
[DllExport("printstrings", CallingConvention = CallingConvention.Cdecl)]
public static void PrintStrings(ref object obj)
{
obj = new string[] { "hello", "world" };
}
И используйте это в Python:
import ctypes
from ctypes import *
from comtypes.automation import VARIANT
dll = ctypes.cdll.LoadLibrary("test")
dll.printstrings.argtypes = [POINTER(VARIANT)]
v = VARIANT()
dll.printstrings(v)
for x in v.value:
print(x)