1

私は次の手順を持っています

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)は、インストール手順によって作成されたばかりのウィンドウサービスです。

4

1 に答える 1

0

この投稿で提案されたリンクに従って問題を解決しました

スタックオーバーフロー:appdomain-createinstancefromandunwrap-unable-to-cast-transparent-proxy

ソリューションコードを提供するリンクは次のとおりです。

west-wind.com:appdomain全体でのアセンブリの読み込み

これは本当に基本的なことです。アセンブリが外部アプリケーション(私の特定のケース:wow64インストーラーアプリケーション)によってロードされる場合に陥りました。

アプリケーションは、ロードしているメインアセンブリに依存するアセンブリの場所を認識していないため、現在のアプリケーションドメイン(私の特定の場合:wow64インストーラーアプリケーション)のカスタムアセンブリリゾルバーを作成して、その中に必要なロード情報。

west-winfリンクにアクセスしてコードを取得すると、完全に機能します

于 2010-06-25T12:27:34.950 に答える