2

私は現在、x64またはx86を特に対象とする混合モードアセンブリ(ネイティブコードを含むアセンブリ)に特定の依存関係を持つPowerShellスナップインを作成しています。依存アセンブリの両方のバージョンがありますが、このスナップインのビルドと展開をどのように管理するのが最善か疑問に思っています。具体的には、次のとおりです。

  1. スナップインの2つのバージョン(1つはx86と1つはx64)が必要であり、2つの異なるバージョンのinstallutilを使用して、アーキテクチャごとに1つずつインストールする必要がありますか?
  2. #1が当てはまるとすると、2つの異なるバージョンのスナップインを異なる「プログラムファイル」および「プログラムファイル(x86)」ディレクトリにインストールすることをお勧めしますか?
  3. 2つの異なるアーキテクチャ用に構築するために、単一の参照以外のすべてを共有するプロジェクトのペアを構築するための理想的な(最も手間のかからない)方法は何ですか?
  4. スナップインが「AnyCpu」としてコンパイルされ、依存するdllが両方ともGACにロードされる場合、ランタイムは、現在実行中のPowerShellホストのアーキテクチャに基づいてGACから正しいアセンブリをロードしますか?
  5. アセンブリのロードコンテキストで問題が発生することなく、実行時にロードする依存dllを動的に選択する(さまざまな理由でGACにインストールできない場合)巧妙な方法はありますか?
4

2 に答える 2

4

マーク、32ビットおよび64ビットバージョンの7zip.dllを使用するPowerShellCommunityExtensionsでこのような状況が発生しています。これは、スナップインの起動の早い段階(またはネイティブDLLを呼び出す必要がある前)にLoadLibraryにPInvokingすることで非常に簡単に回避できます。次に、32ビットまたは64ビットプロセス(IntPtr.Size)であるかどうかをテストし、LoadLibraryPInvokeを使用して正しいDLLを手動でロードできます。その後、DllImport( "YourNative.dll")は、dllがすでにロードされていることを認識し、そのDLLを使用します。

次の2つのPSCXソースコードファイルを見てください。http://pscx.codeplex.com/SourceControl/changeset/view/74794?ProjectName = Pscx# 1358100 http://pscx.codeplex.com/SourceControl/changeset/view/ 74794?ProjectName = Pscx#1358102

于 2010-08-23T21:08:07.747 に答える
1

最終的にモジュールを作成しましたが(ありがとう、Richard!)、プロセッサアーキテクチャに関連する問題は解決しませんでした。これを解決するために、両方のバージョンの依存dllをモジュールディレクトリに配置し、各コマンドレットのコンストラクターに初期化コード(1回だけ実行)を配置して、適切なバージョンの依存dllをロードします。

ポインタをありがとう。

于 2010-08-24T14:59:28.910 に答える