私はアプリケーションのサポートプラグインの作成方法をチュートリアルに従いました。すべて正常に動作しているようですが、プラグインを使用すると、関数の呼び出しとメインアプリケーションの変数へのアクセスが可能になります。私はネットの使用量などを監視するhttpラッパークラスを持っている..メインアプリケーションのために。プラグインは、マザーアプリケーションからhttpラッパーを呼び出します。C#プラグイン:アクセスする母フォームと関数
どうすればこの問題を解決できますか?使用可能なすべての関数/変数を持つクラスを定義する必要がありますか?また、GUIを生成するためのプラグインが必要になりますので、ユーザーはいくつかの設定を行うことができます。
これは私がこれまでに得たものである:
主な用途:
namespace MainApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<iPlugin> PLUGIN_LIST = new List<iPlugin>();
public void LoadPlugins()
{
// load plugins..
}
// how do I call this function from a plugin?!
public void HTTP()
{
// do some networking stuff..
}
private void Form1_Load(object sender, EventArgs e)
{
LoadPlugins();
}
}
}
プラグインインターフェイス:
namespace PluginInterface
{
public interface iPlugin
{
string GetPluginName();
void callHTTP();
void SerVar(string var);
}
}
プラグイン:
namespace MyPlugin
{
public class Main : iPlugin
{
string variable = "";
public string GetPluginName()
{
return "MyPlugin";
}
public void callHTTP(){
MainApplication.HTTP(); // call HTTP in main application
}
public void SerVar(string var)
{
variable = var;
}
}
}
また、私がチュートリアルに従ったとき、プラグインインターフェイスは別のプロジェクトで、MainApplicationとmyPluginの両方で「参照として追加する」必要がありました。それは私のアプリケーションとプラグインがpluginInterface.dllに依存していることを意味しますか?それとも開発に必要なのでしょうか?ランタイムに依存している場合は、私のアプリケーションとプラグインの両方でどうやって定義すればいいのですか?余分なDLLを使う必要はありませんか?希望は意味がある、ありがとう!
EDIT:あなたが取ることができる完全なMainApplicationコード
public interface iPlugin
{
string GetPluginName();
string GetInformation();
void SerVar(string var);
}
namespace MainApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<iPlugin> PLUGIN_LIST = new List<iPlugin>();
public void LoadPlugins()
{
string path = Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName;
string pluginDir = Path.GetDirectoryName(path) + "\\Plugins";
foreach (string s in Directory.GetFiles(pluginDir, "*.dll"))
{
// THIS LINE GIVES THE ERROR
Type[] pluginTypes = Assembly.LoadFile(s).GetTypes();
foreach (Type t in pluginTypes)
{
if (t.ToString().Contains("Main"))
{
iPlugin plugin = Activator.CreateInstance(t) as iPlugin;
PLUGIN_LIST.Add(plugin);
break;
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
LoadPlugins();
}
}
}
メインアプリケーションプロジェクトのプラグインインターフェイスは、私が考えるより意味をなさないでしょう。 –
ありがとうcsm!アプリケーション自体が単一のexeになるため、おそらくできるだけ少ないdllを使用したいと思います。ユーザーがそれをダウンロードすると、アプリはすべてのプラグインをダウンロードしてdirに保存します。メインアプリケーションがpluginInterface.dllに依存している場合、それは機能しません。すべての作業を行うために何かに依存しない別のアプリケーションを使用する必要があります。これは実行したくありません。私が提供したコードを使ってメインアプリケーションとプラグインでpluginInterfaceを定義するにはどうすればいいですか?ありがとう! – user1015551
ありがとう、私は今それを試してみよう! – user1015551