2010-11-29 3 views
1

基本的に問題は、参照されていないアセンブリでメソッドを呼び出そうとしていますが、クラスをインスタンス化するための適切な呼び出しが見つからないようです。私はnullを返す単純なType t = Type.GetType("MyApp.Helper")とセキュリティ例外をスローするAssembly.LoadFrom("MyApp.Helper")のようなものを試しました。Silverlight 4 - アセンブリ間でType.GetType()が動作しない

以下の例では、2つのプロジェクト/アセンブリ(Helper.dllとMenu.dll)が別々に共通の 'libs'フォルダにコンパイルされますが、相互参照はしません。 Main.dllは両方を参照し、参照はVSの 'Copy local'に設定されます。したがって、アプリケーションを実行すると、Main.xapには3つのアセンブリがすべて含まれている必要があり、同じアプリケーションドメインにロードする必要があります。それとも私の理解になります。これは不可能な探求ですか?私はプラグインに関する多くのコメントを見ていますが、これまで私はこの特定のデザインの例を見ていませんでした。たとえば、私はJeff Prosiseがhereと書いているようなことができると思いますが、私はむしろすべてを1つのパッケージに収めています。ここで

は私のコードのスケッチです:1プロジェクト/アセンブリで

、私は労働者のクラスを持っている:別のプロジェクト/アセンブリで

namespace MyApp.Helper { 
    public class Helper { 
     public void ShowHelp() { 
      Console.Write("Help!"); 
     } 
    } 
} 

、私は起動しようとしたメニュークラスを持っていますヘルパー:

namespace MyApp.Menu { 
    public class Selector { 
     public void InvokeSelection(string className, string functionName) { 

      // fails: t will be null 
      Type t = Type.GetType(className); 

      // fails: t will be null 
      t = Type.GetType(string.Format("{0}.{1}, {0}, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null", "MyApp.Helper", "Helper")); 

      // however, this works (reference to main assembly?) 
      t = Type.GetType(string.Format("{0}.{1}, {0}, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null", "MyApp.Main", "Worker")); 

      // and, I'd like to do something like the following 
      // t.InvokeMember(functionName, ...); 
     } 
    } 
} 

最後に、私はメインのアプリアセンブリを持っている:

namespace MyApp.Main { 
    public class Main { 
     public static void Main() { 
      MyApp.Menu.Selector sel = new Menu.Selector(); 
      sel.InvokeSelection("MyApp.Help.Helper", "ShowHelp"); // fails 
      sel.InvokeSelection("MyApp.Main.Main", "Worker"); // works in some cases 
     } 
     public void Worker() { 
      Console.Write("Work!"); 
     } 
    } 
} 

ありがとうございました!

-Chris。

答えて

1

Assemblyオブジェクトを取得してからGetTypeメソッドを呼び出す必要があります。

しかし、あなたはなぜReflectionを使っているのか分かりません。
メソッドは通常、メインプロジェクトから呼び出すことができます。

+0

SLaks、あなたに感謝し、JeffN825:

第二に、これを試してみてください。私はAssembly.Loadを試していたが、うまくいかなかった。私の簡単な例はあまりにも単純でした。私は良いカスタムアセンブリをたくさん持っているし、私がテストしていたものを参照していないようだ。私は 'Assembly.Load' + 'GetType()'を試してみましたが、非常に多くのテクニックを試した後、すべての部品を整列させることはできませんでした。霧を切ってくれてありがとう!あなたの質問に答えるために、私はメニューlibにまっすぐ行く設定ファイルからメニューを初期化しているので、メインのアプリはそれを見ることはありません。このエラーは元々働いていたモノリシックなアプリケーションのリファクタリングによるものです。乾杯! – Chris

0

まずSLであるため、プライベート/保護された/内部のメンバーを呼び出すことはできません。

public void InvokeSelection(string className, string functionName) { 

     var asm = Assembly.Load("MyApp.Helper, Version=1.0.0.0, Culture=\"\", PublicTokenKey=null"); // double check this is correct! 

     Type t = asm .GetType(className); 

     // and, I'd like to do something like the following 
     // t.InvokeMember(functionName, ...); 
    } 
関連する問題