なぜすることはできないのでしょうか取得します。GetType()のタイプのプラグインインスタンス参照しているアプリです。config?
-
18-09-2019 - |
質問
こう。私は私のソリューションは、プロジェクトを実施す:
- ラッパープロジェクトとりあえず今回はコンソールアプリとして現在にwindowsサービスの中でデバッグしやすくなります。
- 労働者プロジェクト-このガッツのコードです。このようにできます簡単にデバッグのコードをwindowsのサービスの頭が痛い。
- プラグインを図書館"プロジェクト-このプラグインが含まれて工場を新設コンクリートのインスタンスを引き出しおよび設定ができます
- プラグインプロジェクト本を含むコンクリートの実施私の引き出しおよび設定ができます
私のラッパーのさまざまなマアプリです。configる私のプラグインは直接参照のために自己の設定をします。このように私のラッパーの申請は必要ありませんか以外のもので、アダプター工場を新のインスタンスの引き出しおよび設定ができます
<configuration>
<appSettings>
<add key="Plugin" value="Prototypes.BensPlugin" />
<add key="Prototypes.BensPlugin.ServiceAddress" value="http://localhost/WebServices/Plugin.asmx" />
<add key="Prototypes.BensPlugin.Username" value="TestUserName" />
<add key="Prototypes.BensPlugin.Password" value="TestPassword" />
</appSettings>
</configuration>
ラッパープロジェクト:
using Worker;
public class Program
{
public static void Main()
{
var serviceProc = new ServiceProcess();
serviceProc.DoYourStuff();
}
}
労働者プロジェクト:
using PluginLibrary;
namespace Worker
{
public class ServiceProcess
{
public string GetRequiredAppSetting(string settingName)
{
/* Code to get a required configuration setting */
}
public void DoYourStuff()
{
string pluginTypeName = GetRequiredAppSetting("Plugin");
//At this point, pluginTypeName = "Prototypes.BensPlugin"
Type type = Type.GetType(pluginTypeName); //type == null, wth!?
//string testTypeName = new BensPlugin().GetType().ToString();
///At this point, testTypeName = "Prototypes.BensPlugin"
//Type testType = Type.GetType(testTypeName)
///And testType still equals null!
if (type != null)
{
IPlugin plugin = PluginFactory.CreatePlugin(type);
if (plugin != null)
plugin.DoWork();
}
}
}
}
プラグイン図書館
namespace PluginLibrary
{
public interface IPlugin
{
void DoWork();
}
public class PluginFactory
{
public IPlugin CreatePlugin(Type pluginType)
{
return (IPlugin)Activator.CreateInstance(pluginType);
}
}
}
プラグイン:
using PluginLibrary;
namespace Prototypes
{
public class BensPlugin : IPlugin
{
public string ServiceAddress { get; protected set; }
public string username { get; protected set; }
public string password { get; protected set; }
public void DoWork()
{
Trace.WriteLine("Ben's plugin is working.");
}
public BensPlugin()
{
/* Code to self configure from app.config */
}
}
}
大丈夫なように設定します。私が来拍車が私の労働者プロジェクトの時に参照 Type.GetType(pluginTypeName)
.私 pluginTypeName
が引かれていますから、設定が正しくな Type.GetType(pluginTypeName)
を返します null
.私たnewingまでインスタンスのプラグインを直接そのコード:
var obj = new BensPlugin();
この作品は、イブレア城、イブレア、 obj.GetType().ToString()
を返します同じ文字列として設定され app.config
.
誰でもできるので教えてかでも最新のコンクリートオブジェクトでは、そのコードが Type.GetType(pluginTypeName)
が破綻してしまう?
解決
それはあなたのタイプがに配置されているアセンブリを指定する必要がある可能性があります:
<add key="Plugin" value="Prototypes.BensPlugin, TheAssemblyName" />
他のヒント
その代わりType.GetType(pluginTypeName)
を呼び出す、Type.GetType(pluginTypeName, true)
を試してみてください。なぜのメソッドGetTypeが失敗だけではなくされ、この方法は、あなたがのの(たぶん)より良い説明を取得する必要があります - ブールパラメータは、コールではなくnull
を返すので、障害が発生した場合に例外をスローする必要があるかどうかを示します神秘的なnull
!
アセンブリ修飾ネーミングを使用してpluginTypeNameですか? pluginTypeNameがロードされているものとして示す含むアセンブリはありますか?
あなたはアセンブリ修飾名を使用している場合は、その後、.NETが自動的にアセンブリをロードすることができるはずです。あなたがいない場合、それは要求された型を含むアセンブリを見つけることができないので、私はType.GetType()
がnullを返すされていることを推測ます。