私は次の手順を持っています
private static IMyInterface OpenInstance(
string assemblyPath,
string classType,
string assemblyName,
out AppDomain domainInstall)
{
IMyInterface interface = null;
AppDomainSetup domaininfo = new AppDomainSetup();
domaininfo.ApplicationBase = assemblyPath;
domainInstall = AppDomain.CreateDomain("PathInstall", null, domaininfo);
ObjectHandle handleService = null;
try
{
handleService = Activator.CreateInstance(
domainInstall,
assemblyName,
classType,
true,
System.Reflection.BindingFlags.CreateInstance,
null,
new Object[] { assemblyName},
System.Globalization.CultureInfo.CurrentCulture,
null, null);
Object myobject = handleService.Unwrap();
interface = (IMyInterface )myobject ;
}
catch (Exception ex)
{
...
}
return interface ;
}
この手順は問題なく機能しますが、インストールカスタムアクション中に呼び出された場合。
言い換えると、自分のInstall(...)オーバーライド内でOpenInstance(...)プロシージャを呼び出すと、次のようになります。
public override void Install(IDictionary stateServer)
インストーラー拡張クラスで定義:
[RunInstaller(true)]
public class SpheresServiceInstaller : Installer
ラップされていないオブジェクトを目的のタイプにキャストしようとすると、例外が発生しました。
interface = (IMyInterface)myobject ;
例外の詳細:
- タイプ:System.InvalidCastException
- メッセージ:「IMyInterface」タイプに透過プロキシをキャストできません。
手順がこれまでに機能する理由を理解したいのですが、この特定の場合です。
詳細
オブジェクト作成手順を段階的に実行しましたが、すべて問題ないようです。オブジェクトはActivator.CreateInstanceプロシージャによって適切に作成されています。
Activator.CreateInstanceによって使用されるアセンブリは、ファイルシステムにすでに存在します。
特定のアセンブリ(ソースコードのassemblyName)は、インストール手順によって作成されたばかりのウィンドウサービスです。