簡體   English   中英

如何在IronPython中調用C#/ .NET命名空間?

[英]How to invoke C#/.NET namespace in IronPython?

我想在IronPython中復制以下內容,到目前為止搜索一直沒有結果和/或令人失望。

namespace Groceries
{
     public class ChocolateMilk : Milk
     {
          // Other stuff here
     }
}

想法是編譯的Python DLL將通過System.Reflection.Assembly.Load加載到C#程序中,並且加載的DLL上的GetType(“Groceries.ChocolateMilk”)不會返回null。

我能找到的最新答案是在2008年,並表示如果不使用Hosting API,這是不可能的 - http://lists.ironpython.com/pipermail/users-ironpython.com/2008-October/008684.html

任何關於如何實現這一點的建議將不勝感激。 目前通過IronPython無法做出的任何結論也將受到贊賞,但不那么重要。

我對你在這里問的問題有點困惑。 您是否嘗試在IronPython模塊中實例化C#代碼? 或者您是否有使用IronPython編寫的等效類,並且您希望在C#代碼中實例化它們?

根據您發布的鏈接,我想您將選擇后者,並且您希望在C#代碼中實例化IronPython類。 答案是,你無法直接實例化它們。 將IronPython代碼編譯為程序集時,不能使用常規.NET代碼中定義的類型,因為IronPython類和.NET類之間沒有一對一的映射。 您必須在C#項目中托管程序集並以這種方式實例化它。

考慮這個模塊, Groceries.py編譯為駐留在工作目錄中的Groceries.dll

class Milk(object):
    def __repr__(self):
        return 'Milk()'

class ChocolateMilk(Milk):
    def __repr__(self):
        return 'ChocolateMilk()'

要在C#代碼中托管模塊:

using System;

using IronPython.Hosting;
using System.IO;
using System.Reflection;

class Program
{
    static void Main(string[] args)
    {
        var engine = Python.CreateEngine();
        var groceriesPath = Path.GetFullPath(@"Groceries.dll");
        var groceriesAsm = Assembly.LoadFile(groceriesPath);
        engine.Runtime.LoadAssembly(groceriesAsm);

        dynamic groceries = engine.ImportModule("Groceries");
        dynamic milk = groceries.ChocolateMilk();
        Console.WriteLine(milk.__repr__()); // "ChocolateMilk()"
    }
}

否則以另一種方式在IronPython代碼中創建.NET類型的實例(如標題所示)。 您需要添加程序集的路徑,引用它,然后您可以根據需要實例化它。

# add to path
import sys
sys.path.append(r'C:\path\to\assembly\dir')

# reference the assembly
import clr
clr.AddReferenceToFile(r'Groceries.dll')

from Groceries import *
chocolate = ChocolateMilk()
print(chocolate)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM