C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Nugetして作成したクラスライブラリでエラー

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■100257 / inTopicNo.1)  Nugetして作成したクラスライブラリでエラー
  
□投稿者/ furu (169回)-(2022/07/13(Wed) 14:43:31)

分類:[C#] 

VS2022 C#
.NET Framework 4.8
Windowsフォーム

PostgreSQLアクセス用のクラスライブラリを作成しています。
NpsqlをNuGetでインストールしました。

このクラスライブラリを参照設定して
PostgreSQLへのコネクションを接続した際
エラーになりました。

    System.IO.FileNotFoundException: 'ファイルまたはアセンブリ 'System.Buffers, Version=4.0.2.0, 
    Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'、またはその依存関係の 1 つが読み込めませんでした。
    指定されたファイルが見つかりません。'

やったこと
  ★クラスライブラリ作成
    namespace ClassLibrary1
      public class Class1

  NuGetでNpgsql.5.0.14をインストール
    ClassLibrary1

    インストール中:

    System.Buffers.4.5.0
    System.Numerics.Vectors.4.5.0
    System.Runtime.CompilerServices.Unsafe.4.6.0
    System.Memory.4.5.3
    System.Text.Encodings.Web.4.6.0
    System.Threading.Tasks.Extensions.4.5.3
    Microsoft.Bcl.AsyncInterfaces.1.1.0
    System.Threading.Channels.4.7.0
    System.ValueTuple.4.5.0
    System.Text.Json.4.6.0
    Npgsql.5.0.14

  Class1にOpenメソッド作成
        public void Open()
        {
            using (var conn = new NpgsqlConnection())
            {
                 conn.ConnectionString = "xxx";
                 conn.Open();
            }
        }

  ClassLibrary1をビルド

  ★Windowsフォームアプリケーション作成
    namespace WindowsFormsApp1
      public partial class Form1 : Form

  ClassLibrary1.dllを参照設定

  PostgreSQLに接続
        private void Form1_Load(object sender, EventArgs e)
        {
            new ClassLibrary1.Class1().Open();
        }

  Open()でエラーになります。

すんなりと実行までいったのですが
どこに問題あるのでしょうか?

  ClassLibrary1.dllと同じフォルダにある全DLL(System.Buffers.dllなど)を参照設定すると
  エラーになりませんでした。
  全DLLを参照設定するのが通常のやりかたでしょうか?

  このエラーは実行する(そこを通る)までわからないのですか?

よろしくお願い申し上げます。

引用返信 編集キー/
■100258 / inTopicNo.2)  Re[1]: Nugetして作成したクラスライブラリでエラー
□投稿者/ Hongliang (1244回)-(2022/07/13(Wed) 15:11:14)
>   ClassLibrary1.dllと同じフォルダにある全DLL(System.Buffers.dllなど)を参照設定すると
>   エラーになりませんでした。
>   全DLLを参照設定するのが通常のやりかたでしょうか?

WindowsFormsApp1プロジェクトの参照に加える必要はありませんが、WindowsFormsApp1.exeが知っている場所(典型的にはexeと同じフォルダ)にSystem.Buffers.dllなどが存在している必要があります。

通常のやり方はまあいくつかありますが、分かりやすいのは、WindowsFormsApp1ソリューションにClassLibrary1プロジェクトを追加し、WindowsFormsApp1プロジェクトはClassLibrary1プロジェクトをプロジェクト参照することです(DLLを直接指定するのではなくて、参照マネージャで「プロジェクト」からClassLibrary1をチェックする)。
そうすれば、Visual StudioがWindowsFormsApp1.exeをビルドした際に必要なアセンブリを適切に配置してくれます。

>   このエラーは実行する(そこを通る)までわからないのですか?

基本的にはそうですね。
そういうことがないように、直接DLL参照するのではなくて、プロジェクト参照したり、NuGetパッケージを参照したりするようにすべきでしょう。
引用返信 編集キー/
■100262 / inTopicNo.3)  Re[2]: Nugetして作成したクラスライブラリでエラー
□投稿者/ furu (170回)-(2022/07/13(Wed) 16:12:10)
No100258 (Hongliang さん) に返信
> 通常のやり方はまあいくつかありますが、分かりやすいのは、WindowsFormsApp1ソリューションにClassLibrary1プロジェクトを追加し、WindowsFormsApp1プロジェクトはClassLibrary1プロジェクトをプロジェクト参照することです(DLLを直接指定するのではなくて、参照マネージャで「プロジェクト」からClassLibrary1をチェックする)。
> そうすれば、Visual StudioがWindowsFormsApp1.exeをビルドした際に必要なアセンブリを適切に配置してくれます。
数十というソリューションから参照されている共通ライブラリなので難しいですね。

ClassLibrary1.dllだけの参照設定で
依存関係ある他もコピーしてくれるといいんですが…

> そういうことがないように、直接DLL参照するのではなくて、プロジェクト参照したり、NuGetパッケージを参照したりするようにすべきでしょう。
NuGetパッケージを知らないプログラマにも使ってもらっているライブラリなので
とりあえず、全DLLを参照設定するようにします。
引用返信 編集キー/
■100265 / inTopicNo.4)  Re[3]: Nugetして作成したクラスライブラリでエラー
□投稿者/ Hongliang (1245回)-(2022/07/13(Wed) 16:31:21)
> NuGetパッケージを知らないプログラマにも使ってもらっているライブラリなので
> とりあえず、全DLLを参照設定するようにします。

まあそれならそれでいいんですが。

DLLを使う側としては、DLL参照という作業ができるのであれば、パッケージ参照も手間は変わらないと思います。
NuGetパッケージは、.NET Frameworkライブラリの場合nuget.exeを使って作成できます。.NET Standardライブラリの場合dotnet.exeで。
引用返信 編集キー/
■100267 / inTopicNo.5)  Re[4]: Nugetして作成したクラスライブラリでエラー
□投稿者/ furu (171回)-(2022/07/13(Wed) 16:59:15)
No100265 (Hongliang さん) に返信
> DLLを使う側としては、DLL参照という作業ができるのであれば、パッケージ参照も手間は変わらないと思います。
> NuGetパッケージは、.NET Frameworkライブラリの場合nuget.exeを使って作成できます。.NET Standardライブラリの場合dotnet.exeで。
すみません。
わかっていません。

ClassLibrary1.dllやSystem.Buffers.dllなどを含めたNuGetパッケージを作成し
それを参照設定するということでしょうか?
引用返信 編集キー/
■100269 / inTopicNo.6)  Re[5]: Nugetして作成したクラスライブラリでエラー
□投稿者/ Hongliang (1246回)-(2022/07/13(Wed) 20:41:48)
2022/07/13(Wed) 20:42:15 編集(投稿者)

> ClassLibrary1.dllやSystem.Buffers.dllなどを含めたNuGetパッケージを作成し
> それを参照設定するということでしょうか?

まあそういうことですね。
https://docs.microsoft.com/ja-jp/nuget/create-packages/creating-a-package
// 使う側は、参照というか、NuGetパッケージマネージャからのインストールですが。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ