.Net マネージ コードからの 32 ビットまたは 64 ビット DLL のロード

StackOverflow https://stackoverflow.com/questions/377181

  •  22-08-2019
  •  | 
  •  

質問

アンマネージ 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のサイドバイサイドその管理カウンターパートとにインストールすることができます。 この記事それがどのように動作するかを説明する必要があります。

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