.Net マネージ コードからの 32 ビットまたは 64 ビット DLL のロード
質問
アンマネージ DLL (Scintilla コード エディターの scilexer.dll、Scintilla.Net によって使用されます) があります。 コードプレックス) Scintilla.Net コンポーネントを介してマネージド アプリケーションからロードされます。Windows マネージド アプリケーションは 32 ビット環境でも 64 ビット環境でも問題なく実行されますが、64 または 32 の scilexer.dll を使用する別のインストールを作成する必要があります。
.Net Framework の DLL ローダーが、.config オプションや「パス名マジック」に応じてアンマネージ DLL を 32 ビットまたは 64 ビット形式でロードできるように、両方の DLL を 32 ビット形式と 64 ビット形式で配布する方法はありますか?
解決
P /呼び出しは、DLLをロードするためにLoadLibrary関数を使用し、与えられた名前でロードされたライブラリがすでに存在する場合、LoadLibrary関数は、それを返します。あなたはDLLの両方のバージョンに同じ名前を付けますが、別のディレクトリにそれらを置くことができるのであれば、あなたはあなたのextern宣言を複製する必要なしに、scilexer.dllから関数への最初の呼び出しの前に一度だけ、このような何かを行うことができます。
string platform = IntPtr.Size == 4 ? "x86" : "x64";
string dll = installDir + @"\lib-" + platform + @"\scilexer.dll";
if (LoadLibrary(dll) == IntPtr.Zero)
throw new IOException("Unable to load " + dll + ".");
他のヒント
残念ながら、私は、この特定のDLLについては何も知りません。あなたはPを行う際ただし、/自分自身を呼び出して、あなたは少しの重複に対処することができ、それはプラットフォームごとに1つのプロキシを作成することが可能です。
たとえば、あなたが32または64ビットのDLLによって実装される必要があり、以下のインタフェースを持っていると仮定します:
public interface ICodec {
int Decode(IntPtr input, IntPtr output, long inputLength);
}
あなたは、プロキシを作成します:
public class CodecX86 : ICodec {
private const string dllFileName = @"Codec.x86.dll";
[DllImport(dllFileName)]
static extern int decode(IntPtr input, IntPtr output, long inputLength);
public int Decode(IntPtr input, IntPtr output, long inputLength) {
return decode(input, output, inputLength);
}
}
と
public class CodecX64 : ICodec {
private const string dllFileName = @"Codec.x64.dll";
[DllImport(dllFileName)]
static extern int decode(IntPtr input, IntPtr output, long inputLength);
public int Decode(IntPtr input, IntPtr output, long inputLength) {
return decode(input, output, inputLength);
}
}
そして最後に、あなたのために正しいものを選ぶの工場を作ります
public class CodecFactory {
ICodec instance = null;
public ICodec GetCodec() {
if (instance == null) {
if (IntPtr.Size == 4) {
instance = new CodecX86();
} else if (IntPtr.Size == 8) {
instance = new CodecX64();
} else {
throw new NotSupportedException("Unknown platform");
}
}
return instance;
}
}
DLLを遅延彼らが呼び出されている最初の時間にロードされると、、これは実際にはそれに固有のバージョンをロードすることができるというそれぞれのプラットフォームにもかかわらず、動作します。より詳細な説明については、この記事を参照してください。
私が思いついた最高のものは次のとおりです。
- 64 または 32 という名前の 2 つの DLL を使用してアプリケーションを配布します
- メインの起動コードには次のものが含まれます。
File.Delete(Application.StartupPath + @"\scilexer.dll"); { // Check for 64 bit and copy the proper scilexer dll if (IntPtr.Size == 4) { File.Copy(Application.StartupPath + @"\scilexer32.dll", Application.StartupPath + @"\scilexer.dll"); } else { File.Copy(Application.StartupPath + @"\scilexer64.dll", Application.StartupPath + @"\scilexer.dll"); } }
あなたはSYSTEM32にDLLを置くことができます。 SYSWOW64 32ビット実system32に64ビット。持ち運びにくいアクセスsystem32には、それらがSYSWOW64にリダイレクトされた32ビット・アプリケーションのための
あなたは、レジストリのエントリを作成することができます。ソフトキーは、32ビットアプリケーションは、ソフトウェアキーとして見ていることWOW6432NODEという名前のサブキーを持っています。
ここでは、どのような<のhref = "https://blogs.msdn.com/powershell/archive/2007/01/09/behind-powershell-installer-for-windows-xp-windows-server-2003.aspxです"REL =" nofollowをnoreferrer "> PowerShellのインストーラはを行います。
アンマネージドDLLはGACのサイドバイサイドその管理カウンターパートとにインストールすることができます。 この記事それがどのように動作するかを説明する必要があります。