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
,private
和public
.
的用法
恕我直言,在 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; }
我正在使用 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
,private
和public
.
恕我直言,在 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; }