如何调用c# /.. NET命名空间

本文关键字:NET 命名空间 调用 何调用 | 更新日期: 2023-09-27 18:10:49

我希望在IronPython中复制以下内容,搜索到目前为止没有结果和/或令人失望。

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

这个想法是编译后的Python DLL将通过System.Reflection.Assembly.Load加载到c#程序中,并且加载的DLL上的GetType(" grocerie . chocolatemmilk ")不会返回null。

我能找到的最近的答案是在2008年,并说这是不可能不使用托管API - http://lists.ironpython.com/pipermail/users-ironpython.com/2008-October/008684.html。

任何关于如何做到这一点的建议将不胜感激。如果有任何结论认为这是目前无法通过IronPython实现的,我们也会很感激,但不太可能。

如何调用c# /.. NET命名空间

我对你的问题有点困惑。你是否试图在你的IronPython模块中实例化c#代码?或者你已经用IronPython编写了等价的类,你想在c#代码中实例化它们吗?

根据你发布的链接,我想你会选择后者,并且有IronPython类,你想在你的c#代码中实例化。答案是,您不能直接实例化它们。当你将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)