dポイントプレゼントキャンペーン実施中!

C#のMsTestで同ソリューション内にUnitTestプロジェクトを作成し、単体テストの準備を進めています。
環境はVisualStudio2015 Professionalになります。
<質問内容>
DLLファイルの動的読み込みを行うテスト対象関数を実行すると、FileNotFoundExceptionが発生し、失敗します。
読み込み方が間違っているのか、DLLファイルの格納場所が間違っているのかもわからず、悩んでおります。
どうすれば正常に動作させることができるのかをご教授頂きたいです。
<DLL読み込み方法>
読み込みにはAppDomainクラスのCreateInstanceAndUnwrap関数を使用します。

例)
<テスト対象プロジェクト・クラス・関数>
●ソース
public class main{
string readData;
public void read(){
AppDomain appDomain = AppDomain.CreateDomain("readDomain");
readClass instance = appDomain.CreateInstanceAndUnwrap("readDLL" , "readDLL.readClass");
readData = instance.read();
AppDomain.Unload(appDomain);
}
}
<DLL読み込み先プロジェクト・クラス・関数>
●アセンブリ名:readDLL
●ソース
namespace readDLL{
public class readClass : MarshalByRefObject{
public string read(){
ファイル読み込み処理
return 読み込みデータ
}
}
}

CreateInstanceAndUnwrap関数の引数(アセンブリ名,完全修飾子)は合っているつもりでいます。
「readDLL.dll」はmainクラス側のプロジェクトフォルダとユニットテストプロジェクトフォルダの\bin\Debugフォルダにも格納しています。
また、System.Reflection.Assembly.GetExecutingAssembly().LocationでAssemblyのフォルダを見てみましたが、ユニットテストプロジェクトフォルダでした。

お手数おかけしますが、ご教授の程、お願いいたします。

A 回答 (3件)

私もやったことがなかったので分からなかったのですが、UnitTest起因では、そもそも走行しているルートディレクトリはvstesthost.exeがあるところだから、まずルートディレクトリを設定しなければならない、だそうです。



https://social.msdn.microsoft.com/Forums/en-US/2 …

ページの最後にDavid Gorena Elizondoが提案しているコードで解決するようです。
でも、このコード自体をユニットテストするなら、その作りにしてあげないといけないので、うーんって感じですね。
いくつかキーワードは確定したので、調べると、いい解決方法を見出している人もいるかもしれません。
    • good
    • 0

アセンブリ名とは、例えば


ConsoleApp1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
という記述かと思いますが。
    • good
    • 0
この回答へのお礼

すみません。言葉足らずでした。
先のお礼に記載したFullNameプロパティが、今回記載頂いた形式のものとなりました。
現在、いくつか実験を試みたところ、フォームプロジェクトを作り、exe格納フォルダにそれぞれのDllファイルを格納し、フォームプロジェクトからmainクラスのread関数を読んでみたところ、正常に動作しました。
この結果から鑑みて、MsTestのUnitTestプロジェクトはアプリではないから、AppDomainが成立せず、実行できないのだろうか?と考えているところです。
そうである場合、どうしたものかと検討中になります。

お礼日時:2018/10/04 11:16

CreateInstanceAndUnwrap()の使い方間違ってやいませんかね。


https://docs.microsoft.com/ja-jp/dotnet/api/syst …
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
assemblyName、typeNameともにreadDLL側でFullNameプロパティからとってきたものを入れてもみたのですが、同様にFileNotFoundExceptionとなります。
メッセージとしては「相対パスに誤りが・・・」というようなメッセージが出るものの、この関数ではパス指定行う例も見受けられなかったため、この関数の引数でパス指定はないものと考えております。
以前フォームプロジェクトから外部DLLをCreateInstanceAndUnwrap関数で読み込む際は、App.configのprodingタグのprivatePath属性に参照先相対パスを記載して動かし、正常に動作したことは確認できております。
今回も最終的にはアプリがmainクラスのDLLを読み込み、同様にApp.configで対処する予定ではいるのですが、現状は単体テストでmainクラスのread関数を対象に正常動作確認を取りたい、という点からユニットテストプロジェクトでテストコードを組んでいるものの、ユニットテストプロジェクトではApp.configもなく、どうすれば読み込めるのかという点がわからず困っている次第であります。

お礼日時:2018/10/04 10:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!