質問

現在、X64またはX86をターゲットにする混合モードアセンブリ(ネイティブコードを含むアセンブリ)に特定の依存関係を持つPowerShell Snapinを書いています。私は両方のバージョンの依存アセンブリを持っていますが、このスナピンのビルドと展開をどのように管理するのが最善か、具体的には次のとおりです。

  1. スナピンの2つのバージョン、1つのx86と1つのx64を使用し、各アーキテクチャに1回、2つの異なるバージョンのInstallutilを使用してインストールする必要がありますか?
  2. #1が真実であると仮定すると、異なる「プログラムファイル」と「プログラムファイル(x86)」ディレクトリに2つの異なるバージョンのスナピンをインストールすることをお勧めしますか?
  3. 2つの異なるアーキテクチャのために構築するために、単一の参照以外のすべてを共有するプロジェクトを構成する理想的な(最も面倒な)方法は何ですか?
  4. スナピンが「anycpu」としてコンパイルされ、従属DLLが両方ともGACにロードされている場合、ランタイムは現在実行中のPowerShellホストのアーキテクチャに基づいてGACから正しいアセンブリをロードしますか?
  5. 動的に動的に、実行時に、アセンブリロードコンテキストで頭痛に遭遇することなく、どの依存DLL(さまざまな理由でGACにインストールできない場合)を選択する滑らかな方法はありますか?
役に立ちましたか?

解決 2

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

すべて、ポインターをありがとう。

他のヒント

マーク、7zip.dllの32ビットバージョンと64ビットバージョンを備えたPowerShellコミュニティエクステンションには、この状況が非常にあります。 Snapin Startupの早い段階で(またはネイティブDLLに電話をかける必要がある前に)LoadLibraryにPinvokingを使用することで、これを簡単に回避できます。次に、32ビットまたは64ビットプロセス(intptr.size)であるかどうかをテストし、LoadLibrary Pinvokeを使用して正しい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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top