Можно ли на 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)
Другие вопросы по тегам