私は他の人が書いたdllを持っていて、それには多くの欠陥があります。このDLLに定義されているクラスが1つしかないとします。このDLLをインポートしてこのクラスのインスタンスを作成する必要があります。 は、DLLのコードは、次のことがありますDLLが動的にロードされているためにプログラムがクラッシュするのを避けるには
[Serializable()]
public class makeExceptionClass
{
public bool isStringNormalized(string aString)
{
// A null check should be performed
return aString.IsNormalized();
}
}
私は、DLLがクラッシュした場合、私のプログラムがまだでも実行できるかどうかをチェックするための小さなプログラムを書きました。このプログラムは概念の証明に過ぎません。 2つの引数をとります。最初はアセンブリからDLLを直接ロードするために使用され、2つ目はクラッシュを引き起こすために使用されます。 プログラムのコードは以下の通りです:
class Program
{
[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
static void Main(string[] args)
{
string typeOfLoading = args[0];
string crash = args[1];
// Load the DLL
if (typeOfLoading.Equals("direct") == true)
{
Console.WriteLine("Loading directly a DLL");
Assembly anAssembly = Assembly.Load("unloadableDLL"); // Directly load the DLL
unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAssembly.CreateInstance("unloadableDLL.makeExceptionClass");
if (crash.Equals("crash") == true)
{
bool test = anObject.isStringNormalized(null);
}
else
{
bool test = anObject.isStringNormalized("test");
}
}
else if (typeOfLoading.Equals("indirect") == true)
{
Console.WriteLine("Loading indirectly a DLL");
AppDomain anAppDomain = AppDomain.CreateDomain("RemoteLoaderDomain"); // Assume it does not fail;
Type t = typeof(unloadableDLL.makeExceptionClass);
unloadableDLL.makeExceptionClass anObject = (unloadableDLL.makeExceptionClass)anAppDomain.CreateInstanceAndUnwrap("unloadableDLL", t.FullName);
if (crash.Equals("crash") == true)
{
bool test = anObject.isStringNormalized(null);
}
else
{
bool test = anObject.isStringNormalized("test");
}
Console.WriteLine("Unloading the domain");
AppDomain.Unload(anAppDomain);
}
else
{
// don't care
}
// terminate
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
問題は、DLLを直接またはのAppDomainにロードされている場合、私のプログラムは関係なく、クラッシュしたということです。 私はC#を完全に新しくしました(私は今朝始めました)が、私はC++のバックグラウンドを持っています。あなたの呼び出しの周り
?例外? – BlueM
あなたはMEFやMAFを調べることを検討するかもしれません。どちらも、アプリケーションに潜在的に敵対的またはバグのある第三者コードをロードし、確立されたインターフェイスを介して通信するためのフレームワークです。より一般的には、本質的に困難な作業を経験している経験豊富なC#プログラマーでさえ、手間がかかります。誰かがC#コーディングの最初の日、あるいは1000日目に選んだのは私が選んだものではありません。がんばろう! –
私は実際にそれを選んだことはありませんでした。私は上司によって親切にそれをするように求められました:D –