2016-10-25 8 views
0

私はIronPythonを使用して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をインポートすることができますか?またはこれは不可能ですか?だから、

+1

なぜ 'ExtensionManager'公開をしていませんか?あなたはそれを内部として定義したので、インポートする理由はありません。 '型またはメンバは、同じアセンブリ内の任意のコードでアクセスできますが、別のアセンブリからはアクセスできません.'は' internal'の定義です。別のアセンブリでそれを使用したい場合は、公開してください。 –

+0

それは私のコードではありません((私はクラスを変更することはできません。私はdllを逆アセンブルし、変更して再度組み立てることはできますか? – madjardi

答えて

2

私はすでに書いたように:あなたはどこか他のあなたのアセンブリよりからアクセスしたい場合は

ExtensionManager公開します。 internalの定義は

型またはメンバーはなく、別のアセンブリから、同じアセンブリ内の任意のコードによってアクセス可能です。それは内部作るなぜ他

using System.Runtime.CompilerServices; 
using System; 

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

、私はいかなる理由が表示されない:別のアセンブリがあるため

は、あなたが何ができるか、友人のアセンブリのためにそれが見えるように、それだけで利用できるようにします別のアセンブリ/あなたのironpythonスクリプトからアクセスしようとしています。ええ、友人集会には、確かに理由があります。新しいアップデートのための

:「私は、クラスを変更することはできません」:

をので、多分、そのクラスを書いた男は、あなたが他の場所からクラスをインポートしないのですか?それはinternal,protected,privateおよびpublicの使用です。

Imho、C#でクラスをinternalと定義するのは本当に悪いので、C#からインポートすることはできませんが、IronPythonでは引き続きインポートできます。

確かに、あなたが書いたように、アセンブリからコードを取り出し、変更して、新しいアセンブリに再度作成してみることができます。しかし、それは多くの仕事であり、おそらく最終的にはうまくいかないでしょう。

+0

ありがとう、私は試みます – madjardi

+0

私はdllを逆コンパイルしようとします。ファイルは問題なくアセンブルできません。私は男に書いた、彼は私がC#インターフェイスICardHostを使用すると言う。私はすでに書いたように – madjardi

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; } 
+1

に感謝します。デコンパイルは多くの作業であり、結局は動作しない可能性があります。そして、確かに、インターフェイスを使用することが最良のソリューション(imo)です。そのため、それらは「インターフェイス」と呼ばれています:) - 私はあなたを助けることができてうれしいです。ハッピーコーディング。 –

関連する問題