从C#Ironpython调用.dll函数

2024-04-23 14:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Ironpython,我从一个.py文件创建了一个.dll。它有类和相应的函数,我想调用它们来在c中使用。我创建了.dll以便可以对用户隐藏源代码。在

以下是我尝试过的:

    ScriptEngine engine = Python.CreateEngine();
    scope = engine.CreateScope();
    engine.Runtime.LoadAssembly(Assembly.LoadFile(fullPath2DLL));
    scope = engine.ImportModule("Simulation");

然而,它找不到“模拟”。在

另外,我想一次导入整个脚本,这样我就可以在任何时候调用任何东西[而不是类'Simulation']。在


Tags: 函数用户py源代码assemblyengineruntimesimulation
1条回答
网友
1楼 · 发布于 2024-04-23 14:20:27

很多事情可能会出错,所以我只向您展示一个完整的例子。让我们看一下我在一些例子中抓取的python代码:

MyGlobal = 5

class Customer(object):
"""A customer of ABC Bank with a checking account. Customers have the
following properties:

Attributes:
    name: A string representing the customer's name.
    balance: A float tracking the current balance of the customer's account.
"""

def __init__(self, name, balance=0.0):
    """Return a Customer object whose name is *name* and starting
    balance is *balance*."""
    self.name = name
    self.balance = balance

def withdraw(self, amount):
    """Return the balance remaining after withdrawing *amount*
    dollars."""
    if amount > self.balance:
        raise RuntimeError('Amount greater than available balance.')
    self.balance -= amount
    return self.balance

def deposit(self, amount):
    """Return the balance remaining after depositing *amount*
    dollars."""
    self.balance += amount
    return self.balance

现在让我们打开ipy并用以下命令将其编译为dll:

^{pr2}$

现在我们有dll了。如您所见,python代码包含类定义,我们的目标是在C中创建该类的实例并调用一些方法。在

 public class Program {
    private static void Main(string[] args) {
        ScriptEngine engine = Python.CreateEngine();            
        engine.Runtime.LoadAssembly(Assembly.LoadFile(@"path_to.dll"));
        // note how scope is created. 
        // "test" is just the name of python file from which dll was compiled. 
        // "test.py" > module named "test"
        var scope = engine.Runtime.ImportModule("test");
        // fetching global is as easy as this
        int g = scope.GetVariable("MyGlobal");
        // writes 5
        Console.WriteLine(g);
        // how class type is grabbed
        var customerType = scope.GetVariable("Customer");
        // how class is created using constructor with name (note dynamic keyword also)
        dynamic customer = engine.Operations.CreateInstance(customerType, "Customer Name");
        // calling method on dynamic object
        var balance = customer.deposit(10.0m);
        // this outputs 10, as it should
        Console.WriteLine(balance);
        Console.ReadKey();
    }
}

相关问题 更多 >