如何调用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实现的,我们也会很感激,但不太可能。
我对你的问题有点困惑。你是否试图在你的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)