web-dev-qa-db-ja.com

混合モードアセンブリとは何ですか?

私はSystem.Data.SQLiteのダウンロード page を見ています。これには、.NET 4の混合モードアセンブリと通常のアセンブリ(私はそう思います)がリストされています。このライブラリを使用する私のプロジェクトはすべてx86にコンパイルされる.NET 4です。

2つの質問があります。

  1. 混合モードアセンブリとは何ですか? Googleは紛らわしい答えの配列を返しますが、どれもあまり意味がありません。 1つの答えは、ネイティブコードとマネージコードを混在させることだと述べていますが、.Netバージョンを混在させると主張する人もいます。
  2. 私の状況ではどのダウンロードを取得する必要がありますか?
39
AngryHacker

http://msdn.Microsoft.com/en-us/library/x0w2664k.aspx

1)常に最初にmsdnを確認します。混合モードは、アセンブリがマネージコードとアンマネージコードを実行できることを意味します。

2)32ビットWindowsのセットアップ(.NET Framework 4.0)

http://system.data.sqlite.org/sqlite-netFx40-setup-bundle-x86-2010-1.0.74.0.exe

「このライブラリを使用する私のプロジェクトはすべて.NET 4であり、x86にコンパイルされます。」

33
Steav

純粋なILから混合モードアセンブリを生成する方法があります。リフレクションを使用してアセンブリを作成する最後の部分には、 AssemblyBuilder.Save の呼び出しが含まれます。 portableExecutableKinds.Required32BitをportableExecutableKind引数に渡すだけの場合は、混合モードのアセンブリを作成します。 PortableExecutableKinds.ILOnlyも渡すことで、この問題を回避できます。つまり.


    Assembly_bldr.Save(exe_name, PortableExecutableKinds.Required32Bit | PortableExecutableKinds.ILOnly, ImageFileMachine.I386 );

言うまでもなく、この情報は大変なものでした...

6
Rob

公式から引用 [〜#〜] faq [〜#〜]

(14)混合モードアセンブリとは何ですか?

混合モードアセンブリは、特定のプロセッサアーキテクチャ用のマネージコードとネイティブコードの両方を含むダイナミックリンクライブラリです。ネイティブコードが含まれているため、コンパイル対象のプロセッサアーキテクチャと一致するプロセスにのみロードできます。このStackOverflowの質問もご覧ください。

それもこの質問を参照しています!

5
bouvierr

SQLiteの場合、バンドルにはSystem.Data.SQLiteの混合モードアセンブリが含まれています。ただし、デフォルトのパッケージには2つの個別のアセンブリが含まれています。1つは完全にネイティブで、もう1つは完全に管理される相互運用アセンブリです。

SQLiteサイトには、実際には [〜#〜] faq [〜#〜] があります。

(15)「バンドル」パッケージとは何ですか(ダウンロードページから)。

ダウンロードページにリストされている「バンドル」パッケージには、個別の「System.Data.SQLite」ではなく、「System.Data.SQLite.dll」という名前のファイル(質問#14を参照)にSystem.Data.SQLite混合モードアセンブリが含まれています。マネージコードとネイティブコードをそれぞれ含むdll "ファイルと" SQLite.Interop.dll "ファイル。

そして以前のFAQ:

(14)混合モードアセンブリとは何ですか?

混合モードアセンブリは、特定のプロセッサアーキテクチャ用のマネージコードとネイティブコードの両方を含むダイナミックリンクライブラリです。ネイティブコードが含まれているため、コンパイル対象のプロセッサアーキテクチャと一致するプロセスにのみロードできます。こちらもご覧ください StackOverflowの質問

なぜ2つのオプションがあるのですか?

私の調査に基づく 、バンドルされていないフォームが利用できるため、マネージコード(C#など)でP/Invokeを使用して、アンマネージコードを呼び出すことができます [ 〜#〜] ijw [〜#〜] 。 IJWは 魔法のように優れている であり、C++プログラムをこのような個別のマネージDLLとアンマネージDLLにコンパイルするメカニズム(P/Invokeも適用される)は 非推奨 以降VS 2015では、SQLiteの新しいバージョンでは、バンドルされていないパッケージが削除される可能性があります。

私は前の段落に何かの直接の証拠がないので、私の研究を再確認する必要があります。これが私の研究です:

0
jpaugh