質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

1501閲覧

C#のラッパーにDLL(x64, x86)を含めて、NuGetパッケージにしたい。

haru853

総合スコア38

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2022/07/17 10:11

実現したいこと

C#のラッパーにDLL(x64, x86)を含めて、NuGetパッケージにしたい。

発生している問題・エラーメッセージ

まず、こちらのサイトを参考におこなってみたのですが、できませんでした。
https://blog.okazuki.jp/entry/2019/09/28/145646

次に色々調べていたところ以下のサイトと同じ症状でしたので、同じようにしてみました。
https://kuttsun.blogspot.com/2020/10/dll-nuget.html

すると出力ディレクトリには以下のとおりに出力できたのですが、DllNotFoundExceptionになってしまいます。
アプリケーション.exe
C#のラッパー.dll
x64/C++のDLL.Dll
x86/C++のDLL.Dll

C++のDLLをアプリケーションと同じディレクトリにコピーすれば動作するはずですが、手動ではなく自動でAny CPUのアプリケーションで使用できるようにしたいです。

尚、上記のサイトでは「publish 時に出力先ディレクトリに外部 DLL がコピーされない」のところで対策のために以下のようにしていますが、そもそもこういった回避策をおこなわないといけないのが何かおかしいような気がしています。

xml

1<Content Include="foo\x64\foo.dll" Pack="true" PackagePath="lib\netstandard2.0\foo\x64" /> 2<Content Include="foo\x64\foo.dll" Pack="true"> 3 <PackageCopyToOutput>true</PackageCopyToOutput> 4</Content>

何か方法はないでしょうか?

補足情報(FW/ツールのバージョンなど)

Visual Studio 2022

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

配布はうまくいっている前提で回答します。
AnyCPU で動作させるには、C# のラッパークラスが、32bit/64bit のどちらで動いているか判定(IntPtr のサイズで判定等)し、
LoadLibrary でそれに適した DLL (32bit のときは x86 フォルダから、64bit のときは x64 フォルダから)をロードします。
ロードが成功すれば、普通の宣言 [DllImport("hoge.dll")] で使用できます。

WebView2 などはこの方法でネイティブDLLを使用しています。

投稿2022/07/17 13:23

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haru853

2022/07/20 11:45

返事が遅くなり申し訳ありません。 NuGetライブラリ側で対応したいと考えていて、調べたところビルドプロセス(MSBuild)を使用したパッケージにするのが良さそうです。 シンプルなパッケージを作成するだけなら簡単なのですが、少し凝ったことをやろうとするとNuGetもMSBuildも奥が深そうです・・・ ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問