2009-05-21 18 views
0

私は、Windowsフォームプロジェクトとクラスライブラリプロジェクトで構成されるアプリケーションを持っています。起動時に、実行可能ファイルはdllに静的な値を設定します。.NET DllまたはExeから実行可能な.NETスタンドアロン実行可能インスタンスにアクセスするにはどうすればよいですか?

using MyClassLibrary; 
namespace MyExeApplication 
{ 
    public partial class MainForm : Form 
    { 
     Hashtable ht = null; 
     void Form_Load(...) 
     { 
      ht = new Hashtable(); 
      ht.add("1", "Open"); 
      ht.add("2", "Close"); 
      Calculate.BasicValues = ht; 
     } 
     public Hashtable GetBasicValues() 
     { 
      return ht; 
     } 
    } 

}  
namespace MyClassLibrary 
{ 
    public class Calculate() 
    { 
     public static Hashtable BasicValues {get; set;} 
    } 
} 

ここで、アプリケーションがメモリ(実行可能ファイル)で実行されているとします。 私の目的は、別のスタンドアロンアプリケーションを作成し、クラスライブラリの関数Calculateで値BasicValuesを使用することです。

using MyClassLibrary; 
namespace TestApplication 
{ 
    public partial class MainForm : Form 
    { 
    private void TestValueFromDll() 
    { 
      System.Windows.Forms.MessageBox.Show("Values of Hashtable"); 
      Hashtable ht = Calculate.BasicValues; 
      //The hashtable is null and values are not there 
      //The above will not work. Could I say something like 
      //Get the running instance of MyExeApplication 
      //and invoke GetBasicValues() ?     
    } 
    } 
} 

私は私のTestApplicationが実行可能TestApplication.exeが配置されているbinフォルダにMyClassLibrary.dllをコピーしたので、それは動作しませんね。したがって、別のdllが使用されました(最初のアプリケーションMyExeApplicationで使用されたdllではありません)。

私の質問はどうすればこの問題を解決できますか? リフレクションを使用してMyExeApplicationのインスタンスを取得し、そこから値を読み取ることはできますか?他の方法はありますか?

は、あなたが同じフォルダ(プロジェクトのプロパティ]メニューで出力フォルダを設定)にTestApplication、MyExeApplication、およびMyClassLibraryを構築する場合、私はあなたがリフレクションを使用することを避けることができます想像するあなた

答えて

0

ありがとうございます。また、なぜこのようなことをする必要があるのか​​不思議です。 BasicValuesはSQLテーブルまたはレジストリ設定で置き換えることができるものですか?

幸運を祈る!

1

DLLがどこにあるかは問題ではありません。本当の問題のように聞こえるのは、DLLが "MyExeApplication" appdomainにロードされ、 "TestApplication" appdomainからアクセスする必要があるということです。また、明らかになったように、.NET Remotingは、Appdomain間の通信を目的としていました。 MSDNにはそれに関する情報がたくさんあります。

0

私が知っているこの方法はありません。他のプロセスにデバッガとして接続することはできません。

最善の方法は、最初のアプリケーションにいくつかの共有スペースにHashtableを格納させることです。ディスク上のファイルとして、データベース内に、共有メモリを使用して、またはリモーティングを使用して周囲に渡すことができます。

どのオプションを使用するかは、実際にどのアプリケーションがどのようにデータを使用するかによって異なります。

0

ありがとうございました。 現在、値を格納する一時記憶域としてレジストリを使用しています。 私はリモートとアプリケーションドメインについて読んで、そのようにしようとします。

私が望む理由は、私はexeアプリケーションをバックグラウンドで実行していることです(Windowsトレイには最小化されています)。このexeアプリは中央APIとして機能し、MyClassLibrary.dllを使用する任意のTestApplicationからアクセスできる必要があるWebログイン情報を生成します。

私はdllクラスのすべてのコードをexeにして、すべてがある実行可能ファイルを1つだけ持っていればよいですか?

MyTestApplicationでは、exeへの参照を追加できました。しかし、私はまだ同じ問題を抱えています。 exe APIと統合する別のアプリケーションを作成したい場合、たとえばMyTestApplication2とexeへの参照を追加しても同じ問題がありますか?

私はこれが反映されていないと思います。 しかし、VB6では、オブジェクトo = GetObject( "MyExeApplication.Class")のようなものを言うことができ、次にo.GetBasicValues()と言うことができます。

+0

私は、あなたがVB 6について話しているようにCOMアウトオブプロセスサーバーのようなものを求めていました。不幸にも、.NETには同等のメカニズムがありません。リモーティングがありますが、それほどシンプルで使いやすいものではありません。 –

関連する問題