2011-06-21 8 views
0

私はこれを精査しており、正しいアプローチを確立できません。私の問題は次のとおりです。私はwinFormsアプリケーションを持っており、その中からintesive .dllを起動したいと考えています。私は何の問題 実行時に起動された.dll内からWindowsフォームを起動する方法

このような
// Execute the method from the requested .dll using reflection (System.Reflection). 
    //[System.Runtime.InteropServices.DllImport(strDllPath)] 
    DLL = Assembly.LoadFrom(strDllPath); 
    classType = DLL.GetType(String.Format("{0}.{0}", ListUfCmdParams[1])); 
    classInst = Activator.CreateInstance(classType); 
    XmlExpInfo = classType.GetMethod(DllParams[0]); 
    XmlExpInfo.Invoke(classInst, paramObj); 

    // Return something. 
    return String.Format("Method '{0}' from '{1}{2}' successfully executed!", 
    ListUfCmdParams[2], ListUfCmdParams[1], strDotDll); 

これは素晴らしい作品が、プロセスが呼び出されたが、とても時間がかかり、私は何が起こっているかをユーザに表示したいではありません、この使用するSystem.Reflectionを行うことができます。これを行うには、.dllファイルにprogressBarとその他の属性を持つWinFormを含めました。私はこれを行うときに例外が発生します。これは、 "Activator.CreateInstance()"がその作業を実行しようとしたときに発生します:MissingMethodException "抽象クラスを作成できません"。私は部分的なクラスを使用しているときにこのエラーに遭遇しました。私はクラスから "partial"キーワードを削除して.dllを正しく実行できるようにしなければなりませんでした。上記の "部分"キーワードを上記のwinFormsクラスから削除することはできません。質問は "私の.dll内からwinFormを呼び出すにはどうすればいいですか?" .dllは呼び出し元のアプリケーションから実行されるときにその進行状況を表示できますか?お時間を

おかげで、

ニック

Psと。私は、次のスレッドを読んでいると、彼らはややあいまいです:

A DLL with WinForms that can be launched from A main app

ら。

+0

dllのメソッドインターフェイスを変更できるとすれば、上のコードから呼び出されたメソッドの引数としてプログレスバーを渡すことはできませんでしたか? – Christian

+0

* partial *キーワードとは関係ありません。 * Reflectionを使用しないで*まず*動作させるようにしてください。その後、それをそのように保つことを検討してください。 –

+0

これは合理的なアプローチのように聞こえるが、これは私が必要とするところではうまくいかない。これはジェネリックの.dllで動作しなければならず、これは呼び出し元をあまりにも具体的にするでしょう。私は、 "抽象クラス"は "部分クラス"宣言と関係がないことに感謝します。しかし、 "部分"キーワードは、コンパイラが叫んでいたものと、.dllが正しく呼び出されるために削除されなければならなかったものです。私は "Reflectionを使用しない"ためになるだろうが、私は管理された.dllのためにこれをどうやって行うのかをfamailarではない。すなわち.dllは.NETの下でC#を使用して作成されます。私はあなたがこれを行うことができると思った 'System.Relection'を使用しています。 – MoonKnight

答えて

0

私はちょうどこの質問をもう一度見て、私が最終的にどのように更新したかと考えました。

最終的に私は、以下を、私が望むものに対して上記を実行する最も効果的な方法であると判断しました。まず、進捗情報を保持するWinFormを起動します。 2番目のyouuは、 "Shown"イベントの中からあなたの "worker"メソッドを宣言します。

最初の部分のコード、すなわちリフレクションを使用してのWinFormを呼び出すためには、以下の通りである:

// Execute the method from the requested .dll using reflection (System.Reflection). 
    Assembly DLL = Assembly.LoadFrom(strDllPath); 
    Type classType = DLL.GetType(String.Format("{0}.{0}", strNsCn)); 
    object classInst = Activator.CreateInstance(classType, paramObj); 
    Form dllWinForm = (Form)classInst; 
    dllWinForm.ShowDialog(); 

を、私は、これは他の誰かに役立ちます願っています。

+0

"DLL"とは何ですか?つまり、どのデータ型が宣言されているのですか? –

+0

あなたのために更新されました... – MoonKnight

0

呼び出し元(dll)に呼び出し元(フォーム)を知らせるべきではありません。代わりに、あなたはProgressUpdatedイベントと時間のかかる方法を実行し、あなたのDLL内のクラスを豊かにできます。フォームは、単にそのイベントのハンドラを割り当てることができ、そしていつでもそれができるDLLがイベントを発生させる可能性が

public event ProgressUpdatedHandler ProgressUpdated; 
public delegate void ProgressUpdatedHandler(object sender, int stepsCompleted, int stepsTotal) 

この方法で

進行状況を示します。

+0

リフレクションを使用すると、これはどのように達成されますか? – Christian

+1

'MethodInfo'と同じように、リフレクションを使用するイベントの' EventInfo'オブジェクトを取得することもできます(実際にリフレクションが最初の場所に移動するかどうかは、ビルドしているものによって異なります)。 –

+0

@C。 Evenhuis。 「リフレクションを使用すると、これはどのように達成されますか?良いものです。 System.Reflectionを使って呼び出し元のアプリケーションにイベントを渡す方法はありません(私は上記の記事を読んだだけです - 私はEventInfoの機能を認識していませんでした!さらに、現在の状況(.dllが内部WinFormを起動しようとすることなく)では、私の.dllは呼び出し元のアプリケーションを「認識」せずに実行されています。私はこの点の根拠がわからない。御時間ありがとうございます。 – MoonKnight

関連する問題