1

だから私はしばらくこれを行う方法を探していましたが、何かを見つけるたびに別の問題につながります.

基本的に、私はゲーム機を持っています。コンソールは、C# コードのスニペットを実行します。コンパイルされたアセンブリは、コンソールが現在のアセンブリのすべての型を認識し、それらを操作できるように、現在のアセンブリのフレンドである必要があります。

問題 1: コンソール コマンドを実行するたびに、新しいアセンブリが生成されます (誰かが方法を知っている場合はこれを避けたいと思います)。それをフレンド アセンブリにするためには、最後のアセンブリと同じ名前を付ける必要があります。残念ながら、以前のアセンブリをアンロードできないため、新しいアセンブリで上書きすることはできません。これにより、AppDomains を使用せざるを得なくなりました。

問題 2: 各アセンブリで個別の AppDomain を使用し、最後のアセンブリをアンロードすると動作しますが、現在の AppDomain のオブジェクトは MarshalByRef から派生していないため操作できません。スクリプトはそれらをシリアライズしようとします。私は AppDomains が好きではありません。

したがって、最も簡単な方法は、同じ AppDomain に別の名前でアセンブリを生成し、実行時に何らかの形でフレンド アセンブリとして設定することだと考えました。

これは不可能かもしれないので、他の代替手段は歓迎します。

編集:より明確にするために。スクリプトは、メイン/親アセンブリの内部にアクセスする必要があります。その逆ではありません。コードを再利用可能にしたいので、メイン アセンブリですべてを公開することはできません。

4

4 に答える 4

1

これらのアセンブリを生成している場合は、必要なアイテムを公開publicするのではなく、公開してみませんinternalか?

または、公開可能なタイプをとしてマークprotected internalし、生成されたアセンブリに派生クラスを作成します(生成されたアセンブリがメインアセンブリを参照していると仮定します)。これにより、生成されたアセンブリがその派生クラスを使用できるようになり、その派生クラスは保護されたメンバーを介してメインアセンブリにアクセスできるようになります。これらのどちらも、メンバーを一般的に「公開」するものではありません。

を使用できますがInternalsVisibleToAttribute、これはコンパイル時です。ただし、コードスニペットからアセンブリを動的にコンパイルしているように思われるため、必要な属性でコンパイルすることもできるはずです。

生成されたアセンブリからメインアセンブリが表示されるようにしたいとは思いませんでした。次の質問の回答で説明されているように、特定のインスタンスの属性に影響を与えることはできますが、型に対して静的に影響を与えることはできません。

C#で属性を動的に追加できますか?

もちろん、生成されたコードは常にリフレクションを使用して型を取得できます。

于 2012-06-06T09:49:57.563 に答える
0

私はあなたの問題に似た問題について考えており、パブリックメソッドをメインアセンブリの内部に公開するある種のプロキシアセンブリを検討しています。

アセンブリ:

  • メイン:プロキシアセンブリから見える内部コンポーネントと内部コンポーネント。
  • プロキシ:メインの内部に間接的にアクセスするためのパブリックメソッドを使用します。
  • コンシューマー:プロキシにアクセスしてメインを変更できます。

私の場合、メインアセンブリは再利用可能なコンポーネントであり、2種類のコンシューマーがあります。最初の種類は、メイン内の再利用可能なコンポーネントを使用するだけなので、メインアセンブリのパブリックメンバーにのみアクセスできます。2番目のコンシューマーは、最初に言及したコンシューマーアセンブリをテストするテストアセンブリです。このアセンブリは通常、メインアセンブリの一部の内部をモックする必要があるため、プロキシを使用してこれらの内部にアクセスしています。

特にアセンブリを生成する場合は、一種のオーバーヘッドになる可能性がありますが、懸念事項を適切に分離できます。

于 2013-03-21T11:05:25.420 に答える
0

InternalsVisibleToAttributeを新しいアセンブリに追加できます。

于 2012-06-06T09:49:22.903 に答える
0

それは不可能のようです。各アセンブリのメンバーを次のように生成できますpublic-アセンブリは動的に生成されるため、これは問題になりません

于 2012-06-06T09:53:21.853 に答える