IronPython 从 C# dll 获取内部 class

IronPython get to internal class from C# dll

我正在使用 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?或者这是不可能的?

所以就像我已经写的那样:

make ExtensionManager public 如果您想从程序集之外的其他地方访问它。 internal的定义是

The type or member can be accessed by any code in the same assembly, but not from another assembly.

要使其仅对另一个程序集可用,您可以做的是使其对朋友程序集可见:

using System.Runtime.CompilerServices;
using System;

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

否则,我看不出有任何理由将其设为内部,而是试图从另一个 assembly/your ironpython 脚本访问它。是啊,朋友聚会,肯定是有原因的。

您的新更新:"I can't change class":

也许,写 class 的人不希望您从其他地方导入 class?那就是internal,protected,privatepublic.

的用法

恕我直言,在 C# 中将 class 定义为 internal 真的很糟糕,因此您无法从 C# 中导入它,但 IronPython 仍然允许您导入它。

当然,您可以尝试从程序集中获取代码,将其更改并重新生成一个新程序集,就像您写的那样。但这需要大量工作,而且最终可能不会奏效。

感谢 Matthias Burger 提出了这个想法。 我尝试反编译dll。因为他disassemble后文件很大,所以assemble没问题。 我写信给那个人,他说我使用 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; }