我正在使用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
?或者这不可能吗?
答案 0 :(得分:2)
就像我已经写过:
如果要从装配以外的其他位置访问它,请将ExtensionManager
公开。
internal
的定义是
类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。
你能做什么,让它只适用于另一个组件,是为了让朋友组件可见:
using System.Runtime.CompilerServices;
using System;
[assembly:InternalsVisibleTo("my_friend_assembly")]
internal class ExtensionManager : IExtensionManager, IDisposable
{
}
否则,我没有看到任何理由将其作为内部但尝试从另一个程序集/您的ironpython脚本访问它。是的,对于朋友集会,肯定有理由。
用于您的新更新:"我无法更改课程":
所以也许,那个写这个班的人不想让你从其他地方导入这个班级?这是internal
,protected
,private
和public
的使用。
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; }