可以让Python从C#接收一个可变长度的字符串数组吗?

时间:2018-01-22 19:38:20

标签: c# python dll ctypes

这可能是一个红色的鲱鱼,但我的非阵列版本看起来像这样:

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";
        }
    }
}

的Python

import ctypes
dll = ctypes.cdll.LoadLibrary(“test.dll")
dll.printstring.restype = ctypes.c_char_p
dll.printstring()

我正在寻找printstrings,它会获取List<string>可变大小。如果那是不可能的,我会选择一个固定长度的string[]

1 个答案:

答案 0 :(得分:8)

.NET能够将object类型转换为COM Automation的VARIANT,反过来,当通过p / invoke层时。

VARIANT在comtypes附带的python的automation.py中声明。

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)