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

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

ただいまの
回答率

90.51%

  • C#

    9029questions

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

  • Oracle

    687questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

自作クラスライブラリで参照設定しているDLLが呼び出せない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,714

gamay

score 3

 前提・実現したいこと

お世話になります。初めてご質問させていただきます。

現在C#でOracleのデータベースに接続するクラスライブラリを自作しています。
Oracleの操作にはNugetパッケージの管理から下記DLLをインストール・参照して使用しています。

Oracle.ManagedDataAccess v12.2.1100

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

新規のプロジェクトを作成して、自作したクラスライブラリを参照して使用すると
次の例外が発生してしまいます。

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

 試したこと

自作のクラスライブラリ内のオラクルの操作クラスを新規プロジェクトにコピーをして
自作ライブラリで使用しているOracle.ManagedDataAccess v12.2.1100をNugetパッケージの管理からインストールするとOracleのデータベースの読み書きができました。

また一度Oracle.ManagedDataAccessをプロジェクトにインストールした後、
Oracle.ManagedDataAccessへの参照を削除して自作ライブラリへの参照を追加して
実行するとOracleのデータベースの読み書きができました。

お聞きしたいこと

以上からおそらく新規で作成したプロジェクトから自作ライブラリのオラクル操作クラスを使用する時にOracle.ManagedDataAccessへの参照が見つけられないためにSystem.IO.FileNotFoundExceptionの例外が発生しているのではないかと考えています。

今回のように自作ライブラリで参照しているDLLを別のプロジェクトからも使えるようにするにはどうしたら良いのでしょうか。
もしくは別の原因でこの問題が起きているのであればご教授いただきたく質問させていただきました。

 開発環境

Windows8.1
VisualStudio2017
FrameWork4.5.2

不足している情報があればご指摘下さい。
よろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

exeのフォルダにOracle.ManagedDataAccessのDLLが存在していると思います。
Nugetで参照追加した場合はこのDLLコピーを自動でやってくれます。
一度Nugetでインストールした後削除しても動くのはDLLがそのまま残っているからです。
ソリューションのクリーンをすると動かなくなるはずです。
参照している自作DLLのフォルダにOracle.ManagedDataAccessのDLLもあるはずなので、
手動でコピーすれば動きます。
ちなみにDLL単体で参照するのではなく、自作のクラスライブラリのプロジェクトを
ソリューションに追加して、プロジェクトごと参照すればDLLのコピーも
自動で行われると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/08 13:31

    sh_akira様

    ご回答ありがとうございます。

    ご指摘の通り、ソリューションをクリーンしたところ同様の例外が発生して動かなくなることが確認できました。

    またソリューションに自作クラスライブラリのプロジェクトを追加し、プロジェクトの参照をしたところ、こちらも問題なく動作できました。

    この自作クラスライブラリを別のソリューション内にあるプロジェクトでも使用する時には同じようにその別のソリューションに追加して参照すれば良いのでしょうか。
    複数のソリューションにまたがって使用したい自作ライブラリはその都度ソリューション毎に追加していくしかないのでしょうか。
    質問からは少しずれてしまいますが今回のような自作ライブラリの使い方をする時のソリューション、プロジェクトの管理方法で良い方法があれば教えていただきたいです。

    よろしくお願いします。

    キャンセル

  • 2018/02/08 15:28

    そのあたりはどうしたいかに依るので一概には言えませんが、
    私は都度ソリューションにプロジェクトごと追加しています。
    クラスライブラリが複数になったりNugetが複数になったりと
    手動でコピーして間違えて古いバージョンを使用したりする方が
    面倒だと思っています。x86とx64を切り替えたりも楽なので。
    共通で使っているライブラリを編集したら他で使っているプロジェクトのテストは必要ですが
    それは手動で追加しても同じことと思います。
    ちなみにDLLで参照したい場合は、プロジェクトのビルドイベントで好きなコマンドを
    実行できますので、使っているDLLを一か所にまとめておいて、ビルドのたびにコピーさせる
    事もできます。

    キャンセル

  • 2018/02/08 17:15

    ご教授ありがとうございます。

    おっしゃる通り、手動コピーするよりはソリューションに都度プロジェクトごと追加した方が間違いがなさそうなので今後はそのように活用していきたいと思います。

    x86とx64の切替はソリューションAとソリューションBがあった時にそれぞれにクラスライブラリのプロジェクトを追加してソリューションAではx86にソリューションBではx64に切替えて使うということでしょうか。
    その場合はAとBで設定を個別に持っているのでしょうか。

    下記方法について勉強不足で分からなかったのでもう少し教えていただけないでしょうか。
    >ちなみにDLLで参照したい場合は、プロジェクトのビルドイベントで好きなコマンドを実行できますので、使っているDLLを一か所にまとめておいて、ビルドのたびにコピーさせる

    お手数おかけしますが、よろしくお願いします。

    キャンセル

  • 2018/02/08 18:07

    プロジェクトごとにx86,x64等の設定は個別に持っていて、
    ソリューションごとにどれを使うか選べます。構成マネージャーを使います。

    プロジェクトのプロパティを開くとビルドイベントのタブがあり、
    ビルド後イベントのコマンドラインが設定できるようになっています。
    ここには自由にコマンドを記載出来ますので、例えばプロジェクトのフォルダに
    DLLsというフォルダを作っておいて、ビルド後イベントに
    xcopy $(ProjectDir)DLLs $(TargetDir) /D /E /C /I /H /Y
    というコマンドを指定すると、DLLsに入れたファイルがビルド後に自動でexeのフォルダに
    コピーされるようになります。
    つまり、プロジェクトのクリーンをしたあと手動でDLLをコピーしなくて良くなります。
    詳しくはビルドイベント xcopyなどで検索してください。

    キャンセル

  • 2018/02/09 17:02

    sh_akira様
    詳しく教えていただきましてありがとうございます。
    ビルドイベントについては初めて知りました。
    今後色々調べて活用してみたいと思います。

    質問内容以外についてもご教授いただきましてありがとうございました。

    キャンセル

+1

こんにちは。

今時の自作クラス参照なら、自作プロジェクトをnugetパッケージ化してしまうという方法があります。
パッケージ化してしまえば、インストール時に依存している別のパッケージも自動でインストールしてくれるので楽ちんです。質問の例だと、自作ライブラリのnugetパッケージをインストールすると勝手にOracle.ManagedDataAccessもインストールされるようにできます。
ローカルのnugetパッケージ置き場を用意して、それをVisualStudioに設定しておけば、通常の公開パッケージのインストールと同様にインストールができるようになります。


ところで、Visual Studio 2017にはプロジェクトをワンボタンでnugetパッケージにするお手軽ボタンが存在するのですが、net452のレガシcsprojを利用している場合は使用できなかったと記憶しています。
このため、残念ながら昔ながらの方法でnugetパッケージを作成する必要があるはずです。詳しくは調べてください。

または、VS2017のpackコマンドを自プロジェクトで使えるようにしたいなら、自プロジェクトのcsprojファイルをSDK-based csprojに書き換えることで動くようにできます。
お手軽にやるなら、新規プロジェクト作成で「.NET Core Class Library(.NET Standard)」みたいなnetstandardのテンプレートを選択して、作成された空プロジェクトのcsprojを丸ごとコピーしてきて、<TargetFramework>がnetstandard2.0になっているものをnet452に書き換えてから上書きしてやればいいです。壊す可能性が高いのでバックアップはしてくださいね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/09 17:02

    tamoto様

    ご回答いただきましてありがとうございます。
    まだ試せていませんがnugetパッケージ化するやり方も今回初めて知りました。
    今まで特にframeworkのバージョンを気にしたことがなかったので、違いを調べて教えていただいたVS2017のpackコマンドでnugetパッケージにするやり方をテストしてみたいと思います。

    キャンセル

同じタグがついた質問を見る

  • C#

    9029questions

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

  • Oracle

    687questions

    Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。