Ссылочный аргумент фреймворка Python .net Double[]&

Используя Python для.Net Framework, я пытаюсь вызвать метод из файла C# .dll. Этот метод имеет следующие аргументы:

public static void ExternalFunction(
    String Arg1,
    ref Double[]& Arg2,
);

Я понял, что.Net Framework конвертирует Python-плавающие числа в двойные. Теперь я хотел бы знать, как создать массив (double) и передать его как ссылку на внешний метод.

У меня есть следующий код:

import clr

clr.AddReference("MyDll")
from MyLib import MyClass

myName = "Benjamin"

r = MyClass.ExternalFunction(myName, 0.0);
print "Result: %s"%r

1 ответ

Решение

Вы можете вызвать этот метод, указав список (или кортеж) с плавающей точкой в ​​качестве второго параметра.

MyClass.ExternalFunction(myName, [0.0]);

Там будет преобразование между 2 различными структурами данных в 2 виртуальных машинах. Python.Net преобразует список чисел с плавающей запятой в массив двойников в среде.Net и передает его по ссылке в вашу функцию. Изменения, внесенные во второй параметр , не будут распространены обратно в python.

Используя отражение, вы можете лучше контролировать маршалинг параметров.

import clr
clr.AddReference("MyDll")
import System
import MyLib

myClassType = System.Type.GetType("MyLib.MyClass, MyDll") 
method = myClassType.GetMethod("ExternalFunction")
numbersArray = System.Array[System.Double]([1.0, 2.0, 3.0])
parameters = System.Array[System.Object](["Benjamin",numbersArray])
method.Invoke(None,parameters)


numbersArray = parameters[1] # an updated Arg2 can be retrieved from parameters array
Другие вопросы по тегам