6


8

Scintilla.Netコンポーネントを通じてマネージドアプリケーションからロードされるアンマネージドDLL(Scintillaコードエディタのscilexer.dll、 CodePlexから使用)があります。 Windows管理アプリケーションは、32ビット環境と64ビット環境の両方で問題なく実行されますが、64または32 scilexer.dllを使用するさまざまなインストールを作成する必要があります。

5 Answer


5


P / InvokeはLoadLibraryを使用してDLLをロードします。指定された名前のライブラリがすでにロードされている場合は、LoadLibraryがそれを返します。 そのため、両方のバージョンのDLLに同じ名前を付けても、それらを別々のディレクトリに置くことができれば、scilexer.dllから関数を最初に呼び出す直前に、extern宣言を複製する必要なく、次のようにできます。

文字列platform = IntPtr.Size == 4 "x86": "x64";文字列dll = installDir @ "\ lib-" platform @ "\ scilexer.dll"; if(LoadLibrary(dll)== IntPtr.Zero)が新しいIOExceptionをスローします( "ロードできない" dll "。")


4


残念ながら、私はこの特定のDLLについて何も知りません。 ただし、自分でP / Invokeを実行したときに少し重複しても対処できる場合は、プラットフォームごとにプロキシを1つ作成することが可能です。

たとえば、次のようなインタフェースがあるとします。これは、32ビットまたは64ビットのいずれかのDLLで実装する必要があります。

パブリックインターフェイスICodec {int Decode(IntPtr入力、IntPtr出力、long inputLength); }

プロキシを作成します。

パブリッククラスCodecX86:ICodec {プライベート定数文字列dllFileName = @ "Codec.x86.dll";

[DllImport(dllFileName)]静的extern intデコード(IntPtr入力、IntPtr出力、long inputLength);

public int Decode(IntPtr入力、IntPtr出力、long inputLength){return decode(input、output、inputLength); }}

そして

パブリッククラスCodecX64:ICodec {プライベート定数文字列dllFileName = @ "Codec.x64.dll";

[DllImport(dllFileName)]静的extern intデコード(IntPtr入力、IntPtr出力、long inputLength);

public int Decode(IntPtr入力、IntPtr出力、long inputLength){return decode(input、output、inputLength); }}

そして最後に、あなたにぴったりの工場を選びましょう。

パブリッククラスCodecFactory {ICodecインスタンス= null。

public ICodec GetCodec(){if(インスタンス== null){if(IntPtr.Size == 4){インスタンス= new CodecX86();}そうでなければ(IntPtr.Size == 8){instance = new CodecX64(); } else {新しいNotSupportedException( "不明なプラットフォーム")をスローします。インスタンスを返します。 }}

DLLが最初に呼び出されるときに遅延的にロードされるので、各プラットフォームはそれに固有のバージョンをロードすることしかできないにもかかわらず、これは実際にはうまくいきます。 より詳しい説明については この記事を参照してください。


2


私が思い付いたのは、次のとおりです。

  • 64または32という名前の2つのDLLを使用してアプリケーションを配布する

  • メインのスタートアップコードには、次のものが含まれます。

File.Delete(Application.StartupPath @ "\ scilexer.dll"); {// 64ビットをチェックして、次の場合に適切なシレクサーDLLをコピーする(IntPtr.Size == 4){File.Copy(Application.StartupPath @ "\ scilexer32.dll"、Application.StartupPath @ "\ scilexer.dll"); } else {File.Copy(Application.StartupPath @ "\ scilexer64.dll"、Application.StartupPath @ "\ scilexer.dll"); }}


1


あなたはsystem32にdllを置くことができます。 syswow64の32ビットと実際のsystem32の64ビット。 32ビットアプリケーションの場合、system32にアクセスすると、Syswow64にリダイレクトされます。

レジストリにエントリを作成できます。 ソフトウェアキーには、32ビットアプリケーションがソフトウェアキーとして認識するWow6432Nodeという名前のサブキーがあります。

https://blogs.msdn.com/powershell/archive/2007/01/09/behind-powershell-installer-for-windows-xp-windows-server-2003.aspx[powershell installer]が実行する内容は次のとおりです。


0


管理対象外のdllは、対応する管理対象と並行してGACにインストールできます。 この記事はそれがどのように働くかを説明するべきです。