ホームページ > バックエンド開発 > C++ > マネージド C# DLL 内にアンマネージ DLL を正常に埋め込んで使用するにはどうすればよいですか?

マネージド C# DLL 内にアンマネージ DLL を正常に埋め込んで使用するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-29 07:44:09
オリジナル
367 人が閲覧しました

How Can I Successfully Embed and Use an Unmanaged DLL within a Managed C# DLL?

マネージド C# DLL へのアンマネージ DLL の埋め込み

マネージド DLL 内へのアンマネージ DLL の埋め込みは、依存関係を統合して保護するための便利な手法です。ただし、これを達成するのは難しい場合があります。

問題:

DllImport を使用してアンマネージ DLL をマネージ DLL に埋め込もうとすると、アクセス拒否が発生します。エラー。

説明:

アンマネージ DLL をリソースとして埋め込むには、単にプロジェクトに埋め込みリソースとして追加するだけでなく、追加の手順を実行する必要があります。

解決策:

正常に埋め込んで使用するにはマネージド DLL 内のアンマネージド DLL:

  1. 組み込み DLL の抽出とロード:

    • 組み込みリソースからアンマネージド DLL を抽出します。
    • を使用して、抽出された DLL を明示的にロードします。 DllImport を使用する前に LoadLibrary を実行します。
  2. 一意の一時ディレクトリを使用する:

    • バージョンごとに一意の一時ディレクトリを作成します。バージョンを回避するためのアセンブリ
  3. ファイル コピー例外の処理:

    • 埋め込み DLL を一時ディレクトリにコピーしようとしたときの例外を処理します。 。ファイルがディレクトリにすでに存在する場合は、例外を無視できる場合があります。

コード例:

次のコードスニペットは埋め込みプロセスを示しています:

// Get a unique temporary directory for this assembly version
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." +
  Assembly.GetExecutingAssembly().GetName().Version.ToString());
if (!Directory.Exists(dirName))
  Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Extract the embedded DLL to the temporary location
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream(
  "MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
  using (Stream outFile = File.Create(dllPath))
  {
    CopyBytes(stm, outFile);
  }
}

// Load the extracted DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
ログイン後にコピー

以上がマネージド C# DLL 内にアンマネージ DLL を正常に埋め込んで使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート