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

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

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

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

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

2回答

5272閲覧

ASP.NET MVCプロジェクトから別のDLLの設定ファイルの値を取得する方法について

yukibeatles

総合スコア12

DLL

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

C#

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2020/07/10 06:55

編集2020/07/13 01:08

前提・実現したいこと

ASP.NET MVCプロジェクトから、C#クラスライブラリの設定ファイルの値を取得したいと考えています。

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

//例外発生時のエラーメッセージは以下の通りです。 'DLLの該当名前空間.該当クラス' のタイプ初期化子が例外をスローしました。 //InnerExceptionは以下の通りです。 System.Configuration.ConfigurationException "現在の構成システムでは、ユーザーによってスコープされた設定はサポートされません。"

該当のソースコード

呼び出し側プログラム(ASP.NET MVC)
(呼び出し側プログラムで呼び出し先プログラムの参照設定は行っています。
また、実行は、ローカル環境(localhost)で該当アクションメソッドが実行されるページにアクセスすることで行っています。)

C#

1[HttpPost] 2public ActionResult Test(TestData testData) { 3   //前略 4 5 //ここでエラー 6 var result = LibraryA.ClassA.ValueA; 7 8   //後略 9}

呼び出し先プログラム(C# クラスライブラリ(.dll))

C#

1namespace LibraryA { 2 public static class ClassA{ 3 //ValueAは設定ファイル(Settings.settingsファイル)内に定義(スコープはアプリケーション) 4 public static string ValueA = Properties.Settings.Default.ValueAProp; 5 } 6}

設定ファイルの定義方法はこちらを参考にしました。

試したこと

・呼び出し側プログラムが、ASP.NET MVCではなく、C#コンソールアプリケーションであれば、呼び出すことが可能でした。
・呼び出し先プログラムのValueAに直接文字列を指定してやると、問題なく呼び出すことが可能でした。

開発環境

●環境
・統合環境:Visual Studio 2019

●プロジェクト
・使用言語:C#(.NET Framework 4.6.1)
・種別:ASP.NET MVC 5 Webアプリケーション

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/07/10 08:11 編集

MVC プロジェクトとライブラリのプロジェクトの Visual Studio 上での構成がどうなっているか、参照設定はしているのか、MVC アプリの実行はどのようにしているのか、詳しいことが何も書いてないです。質問欄を編集して追記してください。
退会済みユーザー

退会済みユーザー

2020/07/10 08:10

ASP.NET のタグもつけてください。
退会済みユーザー

退会済みユーザー

2020/07/11 00:38 編集

回答の上のコメントを読んで、以下のようなことであろうと想像しましたが、合ってますか? (1) あるクラスライブラリ(.dll)があって、Settings.settings ファイルを使用している。 (2) コンソールアプリがあって、上記 .dll を利用している。 (3) 別に ASP.NET MVC5 アプリがあって、上記 .dll を利用している。 (4) 上記 (2) および (3) で、同じ Settings.settings ファイル(結果として生成される .exe.config)を共有して情報を取得したい。 (5) 現状、(2) は期待通り情報を取得できているが、(3) で質問に書いた問題が出る。 上記の事情は最初から質問欄に書いておいてほしかったのですが。 今からでも遅くないので質問欄を編集して追記お願いします。理解が違っていたら違うところは修正してください。 Settings.settings ファイルの項目のスコープがユーザーでは上の回答に述べたとおり ASP.NET では不可能ですが、そこはアプリケーションに変更したのですよね? であれば、質問欄のコードのコメントを修正しておいてください。 あと、(4) で使う .exe.config は物理的に同じファイルなのか、ファイルは別で中身が同じなのかも書いてください。
退会済みユーザー

退会済みユーザー

2020/07/12 02:36 編集

質問者さん、無言になってしまいましたが、私の回答欄に【追記2】を書きましたので、それに対するフィードバックをしてください。 もし、ギブアップしたなどでこのスレッドでの Q&A は不要になったということなら、それはそれで構いませんので、その旨書いてこのスレッドはクローズしてください。 とにかく無言は NG です。
yukibeatles

2020/07/12 01:42

返信が遅くなり申し訳ございません。 上手くいかず現在検証しておりますので、少々お時間頂けますでしょうか。 明日には回答予定です。 遅くなり申し訳ございませんが、宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2020/07/12 02:37

返答をありがとうございます。お待ちします。
guest

回答2

0

自己解決

呼び出し先のDLLの設定のすべての設定値(呼ぶ、呼ばないに関わらず)をアプリケーションスコープにする必要がありました。

呼び出し先のDLLの設定に1つでもユーザスコープの設定値が含まれていると、
ASP.NETアプリケーションでは呼ぶことができない様です。
理由に関しては、SurferOnWww 様が仰って頂いたように、ワーカープロセスからアクセスできないのだと思われます。
(このような意味でご回答頂いていたようであれば、申し訳ございません。)

投稿2020/07/13 06:46

yukibeatles

総合スコア12

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

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

退会済みユーザー

退会済みユーザー

2020/07/13 07:03 編集

MVC アプリが .dll を呼び出して、その .dll が使う .dll.config はどこにあったのですか? bin フォルダにあったにもかかわらず「1つでもユーザスコープの設定値が含まれている」とダメだったと言ってますか?
退会済みユーザー

退会済みユーザー

2020/07/13 07:23 編集

ということは、私の回答の【追記】で、 > 「スコープはユーザー」ということは、ユーザーの個人情報と思いますが、であればそれを構成ファイルに保存することは ASP.NET Web アプリでは不可能です。無理筋とかいうレベルではなくて、誰が何と言おうと 100% 不可能です。 【追記2】には、 > スコープはもちろん「アプリケーション」でなければなりません。 ・・・と書いたことは見てもらえなかったということ?
yukibeatles

2020/07/13 08:12

.dll.configのファイルパスはいまだに不明です。 MVCアプリのプロジェクトファイルをdllのファイル名で全検索しましたが、ありませんでした。 MVC アプリ側の参照設定で、 .dllファイルは別のPATHを通したフォルダにコピーしたものの方を参照設定していますが、.dll.configはそのフォルダ内にもありません。 2020/07/10 18:25の書き込みに示した、フォルダ内にもありませんでした。 元のdllファイルのプロジェクトファイルのbinフォルダ内の .dll.configを参照しているのかと思い、一度削除してみましたが、それでも正しく設定値を取得できたので、ここでもありません。 ただ、.dll.configに「1つでもユーザスコープの設定値が含まれている」とダメな様です。 ユーザスコープの設定値を削除すると、正しく動作しました。
yukibeatles

2020/07/13 08:19 編集

>スコープはもちろん「アプリケーション」でなければなりません。 に関して私は、呼び出し元のアプリケーションが、呼び出す先の呼び出す設定値のスコープのみが「アプリケーション」であればよいと認識していましたが、そうではなく、呼び出す/呼び出さないに関係なく、呼び出す先のすべての設定値のスコープを「アプリケーション」に変更する必要がありました。 私の認識が甘く申し訳ございません。
guest

0

MVC プロジェクトとライブラリのプロジェクトの Visual Studio 上での構成がどうなっているか、参照設定はしているのか、MVC アプリの実行はどのようにしているのか、詳しいことが何も書いてないので、想像を膨らませてのレスですが・・・

ライブラリが使う構成ファイルがワーカープロセスからアクセスできない場所にあるからではないかと思います。問題の Properties.Settings.Default.ValueAProp を保存する構成ファイルはどこにあるのですか?

構成ファイルの保存場所の一般的な説明については以下の記事を見てください。

構成ファイルの保存場所
http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx

【追記】

今気が付きました。

//ValueAは設定ファイル内に定義(スコープはユーザー)

「スコープはユーザー」ということは、ユーザーの個人情報と思いますが、であればそれを構成ファイルに保存することは ASP.NET Web アプリでは不可能です。無理筋とかいうレベルではなくて、誰が何と言おうと 100% 不可能です。

ユーザー固有の情報ならユーザー認証を実装していると思いますが、ASP.NET Identity ならプロファイルを使ってはいかが?

【追記2】

下の 2020/07/11 11:01 の私のコメントで「後で、どのように試したかを質問欄に追記しておきます」と書きましたが、それを以下に追記します。

以下のようにすれば LibraryA の Settings.settings ファイルに設定した文字列は、MVC のコントローラーで、質問者さんと同じコードを使って取得できます。

MVC アプリのプロジェクトと同じソリューション内にクラスライブラリ LibraryA を追加し、下の画像の通り Settings.settings ファイルに文字列情報を追加。スコープはもちろん「アプリケーション」でなければなりません。Class1.cs の中の ClassA のコードは質問のコードをそのままコピペします。

イメージ説明

MVC プロジェクトで LibraryA を参照に追加します。

イメージ説明

そうすれば、ソリューションをビルドすると自動的に MVC プロジェクトの bin フォルダに LibraryA の .dll とともに .dll.config が コピーされます。その .dll.config に LibraryA の Settings.Settings ファイルに設定した文字列 "LibraryA の Settings.settings に設定した文字列" が含まれています。

イメージ説明

その後、コントローラで、質問者さんのコードの var result = LibraryA.ClassA.ValueA; を使って、bin フォルダにコピーされた .dll.config ファイルから目的の文字列を取得できます。

なので、最初の回答に書いた、

ライブラリが使う構成ファイルがワーカープロセスからアクセスできない場所にある

・・・は当たっていると思います。MVC プロジェクトの bin フォルダに .dll.config が無いのでは?

現状システムでは、サーバ側webアプリケーション(ASP.NET)とサーバ側常駐アプリケーション(C#コンソールアプリケーション)で、それらの橋渡しをする為に、同じ設定値を参照する必要があります。

「同じ設定値を参照」というのが、物理的に同じファイルから値を取得するということですと、それは無理っぽいです。.dll.config ファイルの配置場所は MVC アプリとコンソールアプリで別にならざるを得ないようですので。

同じ内容の .dll.config ファイルのコピーを 2 つ作って、MVC アプリとコンソールアプリに別々に配置するということは可能かもしれません。

そこは自分は未検証・未確認です。質問者さんの方で試して結果を教えてください。

投稿2020/07/10 08:09

編集2020/07/11 09:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yukibeatles

2020/07/10 09:25

質問に必要な要点を掴めておらず申し訳ございません。 エラー原因としては、呼び出し元プログラムがProperties.Settings.Default.ValueAPropが保存されている構成ファイルにアクセスできないため、生じている可能性がある、という認識で正しいでしょうか。 ご教示頂いたページの構成ファイルの保存場所を確認してみたところ、 すべてのユーザーに適用するグローバル構成は、 プロジェクトフォルダ内のbin\Debug\アプリケーション名.exe.Configで、 ローミング ユーザーに適用する構成、個々のユーザーに適用する個別構成は、共に C:\ユーザ名\AppData\Roaming\プロジェクト名\プロジェクト名exe_Url_乱文字列\1.0.0.0\user.config となっておりました。 呼び出し元プログラムがアクセスできなければいけない構成ファイルは、どちらになるのでしょうか。
退会済みユーザー

退会済みユーザー

2020/07/10 09:34 編集

上のコメントと回答欄への追記が前後してしまいましたが、追記に書いたように、保存するのがユーザーの個人情報ならそれを構成ファイルに保存することは ASP.NET Web アプリでは不可能です。考え直しましょう。
yukibeatles

2020/07/10 09:54

引き続きご回答ありがとうございます。 アプリケーションスコープとユーザースコープに関して、認識を誤っておりました。 (因みにASP.NET MVCプログラムからユーザースコープの構成ファイルにアクセスできないのは、ユーザの判別ができない為、構成ファイルが格納されているユーザフォルダにアクセスできない為と認識しておりますが、正しいでしょうか。) 該当の値は、アプリケーションスコープで問題ありませんので、アプリケーションスコープに変更し、再ビルド、呼び出し元の参照設定を一度解除し、再度参照設定を行いましたが、 同様のエラーを発生させてしまいます。
退会済みユーザー

退会済みユーザー

2020/07/10 10:44

参照しているライブラリの設定ファイルを使うなんてことは自分は考えたこともないです。無理筋なことを考えているような気がします。どういう目的で、何を保存したいのか、その目的に合った ASP.NET としての最適な方法を考えた方がよさそうです。
yukibeatles

2020/07/10 22:36

現状システムでは、サーバ側webアプリケーション(ASP.NET)とサーバ側常駐アプリケーション(C#コンソールアプリケーション)で、それらの橋渡しをする為に、同じ設定値を参照する必要があります。 一部ライブラリでは、同方法での動作が確認できたので、なんらかの設定が誤っている様に予想しています。 もう少し要因を考えてみます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2020/07/11 00:37 編集

上のコメントを読んで、以下のようなことであろうと想像しましたが、合ってますか? (1) あるクラスライブラリ(.dll)があって、Settings.settings ファイルを使用している。 (2) コンソールアプリがあって、上記 .dll を利用している。 (3) 別に ASP.NET MVC5 アプリがあって、上記 .dll を利用している。 (4) 上記 (2) および (3) で、同じ Settings.settings ファイル(結果として生成される .exe.config)を共有して情報を取得したい。 (5) 現状、(2) は期待通り情報を取得できているが、(3) で質問に書いた問題が出る。 上記の事情は最初から質問欄に書いておいてほしかったのですが。 今からでも遅くないので質問欄を編集して追記お願いします。理解が違っていたら違うところは修正してください。 Settings.settings ファイルの項目のスコープがユーザーでは上の回答に述べたとおり ASP.NET では不可能ですが、そこはアプリケーションに変更したのですよね? であれば、質問欄のコードのコメントを修正しておいてください。 あと、(4) で使う .exe.config は物理的に同じファイルなのか、ファイルは別で中身が同じなのかも書いてください。
退会済みユーザー

退会済みユーザー

2020/07/11 02:01

ちょっと試してみましたが、普通にやれば LibraryA の Settings.Settings ファイルに設定した文字列は、MVC5 のコントローラーで質問者さんと同じコードで取得できます。 なので、最初の回答に書いた、 > ライブラリが使う構成ファイルがワーカープロセスからアクセスできない場所にある ・・・は当たっていると思います。 後で、どのように試したかを質問欄に追記しておきます。その前に上のコメントでお願いした件、質問欄に追記願います。
yukibeatles

2020/07/13 00:26 編集

詳細の対応方法に関して、ご対応頂いていたにも拘らず、 確認が遅くなり申し訳ございません。 ご提案頂いた、同じ内容の .dll.config ファイルのコピーを 2 つ作って、MVC アプリとコンソールアプリに別々に配置する、ですと、管理が煩雑になってしまう、様に予想されましたので、別の方法を色々試してみました。 >「同じ設定値を参照」というのが、物理的に同じファイルから値を取得するということですと、それは無理っぽいです。.dll.config ファイルの配置場所は MVC アプリとコンソールアプリで別にならざるを得ないようですので。 ASP.NET MVC側のソリューションには該当のDLLプロジェクトを追加せず、ASP.NET MVC側の参照にのみ該当のDLLを追加すると、同じ設定値を参照することができるようです。(該当のDLLは、DLLのプロジェクトファイルとは別の、PATHを通したフォルダに配置しました。また、.dll.config ファイルがASP.NET MVCソリューション内のフォルダにも追加されていないので、恐らく物理的に同じファイルから値を取得できているのではないか、と推測しています。) ただ、上記方法で本問題が解決するDLLと解決しないDLLが存在し、現時点でその差異が生じる原因は把握できておりません。 こちらの問題が解決次第、解決方法を記載し、こちらを閉めたいと思います。
退会済みユーザー

退会済みユーザー

2020/07/13 00:35

質問の 2020/07/11 09:29 の私のコメントでお願いしたことはやってもらえないのですか?
yukibeatles

2020/07/13 00:39

今編集中ですので、少々お待ちいただけますでしょうか。
退会済みユーザー

退会済みユーザー

2020/07/13 00:56

> ご提案頂いた、同じ内容の .dll.config ファイルのコピーを 2 つ作って、MVC アプリとコンソールアプリに別々に配置する、ですと、管理が煩雑になってしまう、様に予想されましたので、別の方法を色々試してみました。 提案しているわけではなくて、クラスライブラリの Settings.settings の情報を使うならそういう手段を取らざるを得ないと言っているだけです。 私の提案は、2020/07/10 19:44 の私のコメントで書いたように「どういう目的で、何を保存したいのか、その目的に合った ASP.NET としての最適な方法を考えた方がよさそうです」です。 例えば、DB を使うとか、DB が無理ならテキストファイルなり xml ファイルをコンソールアプリと共通に使い、MVC では Application_Start あたりで ApplicationState に情報を読み込んでそれを使うとか。 > ASP.NET MVC側のソリューションには該当のDLLプロジェクトを追加せず、ASP.NET MVC側の参照にのみ該当のDLLを追加すると、 ASP.NET ですからクラスライブラリの .dll は bin フォルダに配置されてないと動きません(GAC に配置しているなら話は別ですがそういうことはしてないと思ってます)。なので、MVC アプリでクラスライブラリが動いたのであれば bin フォルダに .dll は存在するはずです。 ということは、.dll.config も bin フォルダに存在しないと読んでこれないはずです。先に紹介しましたが以下の記事を読んでください。 構成ファイルの保存場所 http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx その記事に書きましたが、構成ファイルのファイルパスは ConfigurationManager.OpenExeConfiguration メソッド で Configuration オブジェクトを取得し、その FilePath プロパティを使って取得できますので試してみてはいかがですか?
yukibeatles

2020/07/13 01:31

引き続きご回答ありがとうございます。 要点を理解できておらず申し訳ございません。 対応方法としては、共有可能なxmlファイルが用途として合っていると考えられますので、設定ファイルで対応できないようであれば、xmlファイルで対応しようかと考えております。 他アプリケーションも設定ファイルで管理しており、極力設計思想を合わせたいので、勉強の意味も込め、もう少し設定ファイルで挑戦してみようと思っております。 >ASP.NET ですからクラスライブラリの .dll は bin フォルダに配置されてないと動きません(GAC に配置しているなら話は別ですがそういうことはしてないと思ってます)。なので、MVC アプリでクラスライブラリが動いたのであれば bin フォルダに .dll は存在するはずです。 仰る通りGACには配置しておりません。 binフォルダ内に .dllの .dll.config ファイルは存在しておりませんが、.dllファイル自体は存在しております。(参照で該当DLLのプロパティでローカルにコピーをTrueにしている為) 現状確認している挙動から、 ASP.NETアプリケーションからはdllファイル参照しているだけで、.dllの設定ファイルは.dllファイルからアクセスしているだけ、というのは考えられませんかね…? (サーバへのデプロイ前でローカル環境での確認ですが) またdll側の3構成ファイルのファイルパスは2020/07/10 18:25で記載した通りです。 呼び出し元のアプリケーションからどの構成ファイルにアクセスが必要があるのか、もう少し確認してみます。
退会済みユーザー

退会済みユーザー

2020/07/13 01:43 編集

> .dllの設定ファイルは.dllファイルからアクセスしているだけ、 それはそうですが、.dll.config にアクセスするには、その .dll.config がどこにあるか知ってないとアクセスできません。当たり前ですが。.dll と同じフォルダにあるというのがお約束ですから、そこ以外にあっても見つけられないかと・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問