IronPython从C#dll进入内部类

时间:2016-10-25 06:31:39

标签: c# ironpython

我正在使用IronPython从C#dll中获取内部类。 例如:

namespace Platform.CardHost {
    internal class ExtensionManager : IExtensionManager, IDisposable {
    //... other code

IronPython代码

import clr
clr.AddReference('Platform.CardHost')
import Platform.CardHost.ExtensionManager
# raise ImportError: No module named ExtensionManager
# if it add to ref
clr.AddReference('Platform.CardHost.ExtensionManager')
# raise Error
# IOError: System.IO.IOException: Could not add reference to assembly
# Platform.CardHost.ExtensionManager

如何导入ExtensionManager?或者这不可能吗?

2 个答案:

答案 0 :(得分:2)

就像我已经写过:

如果要从装配以外的其他位置访问它,请将ExtensionManager公开。 internal的定义是

  

类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。

你能做什么,让它只适用于另一个组件,是为了让朋友组件可见:

using System.Runtime.CompilerServices;
using System;

[assembly:InternalsVisibleTo("my_friend_assembly")]
internal class ExtensionManager : IExtensionManager, IDisposable 
{
}

否则,我没有看到任何理由将其作为内部但尝试从另一个程序集/您的ironpython脚本访问它。是的,对于朋友集会,肯定有理由。

用于您的新更新:"我无法更改课程":

所以也许,那个写这个班的人不想让你从其他地方导入这个班级?这是internalprotectedprivatepublic的使用。

Imho,在C#中将类定义为internal非常糟糕,因此您无法从C#导入它,但IronPython仍允许您导入它。

当然,您可以尝试从程序集中获取代码,更改它并再次使用新的程序集,就像您写的那样。但这需要做很多工作,最终可能不会奏效。

答案 1 :(得分:1)

感谢 Matthias Burger 提出这个想法的事实。 我尝试反编译DLL。因为拆解后文件很大,所以无法正常组装。 我写信给那个人,他说我用C#接口ICardHost 在这里我如何使用它,也许是遇到类似问题的人。

clr.AddReference('Platform.CardHost')
from Platform import CardHost
from Platform.CardHost import ICardHost

host = CardHost.CardHost.CreateInstance(session)
# ExtensionManager is internal class but it available by interface
# here how to use C# interface
em = ICardHost.ExtensionManager.__get__(host) 

就像在C#中一样

// cardHost
public sealed class CardHost : Component, ICardHost

// ICardHost 
public interface ICardHost {
IExtensionManager ExtensionManager { get; }