私は現在、戻り値タイプbool
のDLLを呼び出すために使用されているメソッドを持っています。この方法は、私があらゆるタイプのDLLからの戻り値を取得できるように、私はこの方法を拡張したい、今すぐ一般的なメソッドの定義
public static bool InvokeDLL(string strDllName, string strNameSpace,
string strClassName, string strMethodName,
ref object[] parameters,
ref string strInformation,
bool bWarnings = false)
{
try
{
// Check if user has access to requested .dll.
if (!File.Exists(Path.GetFullPath(strDllName)))
{
strInformation = String.Format("Cannot locate file '{0}'!",
Path.GetFullPath(strDllName));
return false;
}
else
{
// Execute the method from the requested .dll using reflection.
Assembly DLL = Assembly.LoadFrom(Path.GetFullPath(strDllName));
Type classType = DLL.GetType(String.Format("{0}.{1}",
strNameSpace, strClassName));
if (classType != null)
{
object classInstance = Activator.CreateInstance(classType);
MethodInfo methodInfo = classType.GetMethod(strMethodName);
if (methodInfo != null)
{
object result = null;
result = methodInfo.Invoke(classInstance, new object[] { parameters });
return Convert.ToBoolean(result);
}
}
// Invocation failed fatally.
strInformation = String.Format("Could not invoke the requested DLL '{0}'! " +
"Please insure that you have specified the namespace, class name " +
"method and respective parameters correctly!",
Path.GetFullPath(strDllName));
return false;
}
}
catch (Exception eX)
{
strInformation = String.Format("DLL Error: {0}!", eX.Message);
if (bWarnings)
Utils.ErrMsg(eX.Message);
return false;
}
}
です。私はジェネリックスを使ってこれを行うことを計画しましたが、すぐに私には分かりませんでした。コンパイル時に未知のTを返すにはどうすればいいですか?私はリフレクションを見ましたが、この場合にどのように使用されるのかは分かりません。上記のコードで
public static T InvokeDLL<T>(string strDllName, string strNameSpace,
string strClassName, string strMethodName,
ref object[] parameters, ref string strInformation,
bool bWarnings = false)
{
try
{
// Check if user has access to requested .dll.
if (!File.Exists(Path.GetFullPath(strDllName)))
{
strInformation = String.Format("Cannot locate file '{0}'!",
Path.GetFullPath(strDllName));
return "WHAT/HOW??";
...
を最初にチェックしてくださいどのように私は私が望むものを達成することができ、または私はちょうどメソッドをオーバーロードしなければなりませんか?
ご協力いただきありがとうございます。
2番目のコードブロックでは、エラー状態のように見えます。 '新しいArgumentException()をスローする方が適切なのでしょうか?他のリターンについては、Heinziが示唆していることをしてください。 –
+1この場合はわかりません。 Exception.Messageが時にはユーザーの目に見えないことがあるため、エラーの原因を自分で定義することがより明確になることがあります。しかし、私はこれがそのようなケースの1つであるとは確信していません。あなたの時間をありがとう... – MoonKnight
私はジェシーと同意します - あなたが見つけたり、メソッドを呼び出すことに失敗した場合は、スローする必要があります。ユーザーは、収益が成功を意味すると予想する必要があります。管理された世界は、このような失敗を伝えるために例外を使います。特別なリターンではありません。 – payo