0

私はC#で動的なコード実行を実装しています。これにより、ユーザーはその特定のアプリケーション用に独自のC#を作成できます。

動的コードの実行にC#コードコンパイラを使用しています。C#コンパイラは、コードファイルを読み取り、新しい名前空間(完全に新しいコード)でコードを作成し、コンパイルして実行します。他のビューでは、ベースアプリケーションはこれらすべてをホストします。

動的コードで実行したいホストアプリケーションに存在するメソッドがいくつかあります。他の名前空間やアプリケーションのメソッドを実行する方法はありますか?

4

3 に答える 3

1

動的コードが静的コードのメソッドを呼び出せるようにするには、動的コードをコンパイルするときに必要な参照を提供する必要があります。

詳細:

MyClass動的コードからアクセスしたいというクラスがあるとします。クラスを別のアセンブリに入れて、MyClassそれを呼び出しましょうMyAssembly。動的コードをコンパイルする場合、のプロパティの1つをICodeCompiler使用して、アセンブリを参照として提供できます。したがってtypeof(MyClass).Assembly、そのプロパティを介して提供する必要があります。

これで、コードをコンパイルすると、次のようなことができるようになります。

MyClass.CallSomeMethod();

ここでは名前空間は問題ではありません。動的コードが完全な型名を使用していることを確認できます(たとえば、動的コードの先頭でをMyNameSpace.MyClass生成できます。using MyNamespace;

最後に、動的コードが使用できる明確なインターフェイスを定義するというリチャードの推奨事項に参加します。コンパイルするときに、このインターフェイスを含むアセンブリを参照として提供する必要があります。

于 2010-12-21T12:34:13.767 に答える
1

スクリプトの作成者にインターフェイスの実装を強制することも、独自の実装でコードをラップすることもできます。

何かのようなもの

public interface IMyApplication
{
      void DoSomethingInMyMainApp();
}
public interface IScriptKiddie
{
      void Init(IMyApplication app);
}

次に、l33tスクリプターは次のように書くことができます

public class MyScript : IScriptKiddie //< you could emit this yourself
{

     public void Init(IMyApplication app) //<could emit this yourself if scripter knows app keyword
     {
          app.DoSomethingInMyMainApp();
     }
}

また、アプリでは、IMyApplicationの具体的な実装を提供して、コンパイル、クラスの構築、およびInitメソッドへの受け渡しが完了したときにクラスに渡すことができます。

于 2010-12-21T12:18:38.090 に答える
0

リフレクションを使用できます。このようなもの:

Type objType = null;
objType = _Assemblies.GetType(className);
MethodInfo methodInfo = null;
methodInfo = objType.GetMethod(TheCommandString);
methodInfo.Invoke(objType, userParameters); 
于 2010-12-21T12:36:14.330 に答える