プロジェクトのプラグイン .dll に実装されたクラスのインスタンスを作成して、型検出を行おうとしています。私はこの例外を受け取っています:
アセンブリ 'SquidReports.DataCollector.Plugin.BES、バージョン = 1.0.0.0、カルチャ = ニュートラル、PublicKeyToken = null' からタイプ 'Action' を読み込めませんでした。
これは私が使用している正確なメソッド シグネチャです: https://msdn.microsoft.com/en-us/library/d133hta4(v=vs.110).aspx
つまり、次のように、アセンブリ名とクラス名に基づいてオブジェクトを生成しようとしています。
object modelObject = Activator.CreateInstance((string)modelInfo.AssemblyName, (string)modelInfo.ModelName);
ここで注意すべき重要な点は、アセンブリの「完全な」名前 (Version、Culture、PublicToken を含む) ではなく、「短い」名前を使用していることです。ただし、MSDN は明確に次のように述べています。
'assemblyName' は、次のいずれかになります。 パスまたはファイル拡張子を含まない、アセンブリの単純な名前。
たとえば、パスと名前が .\bin\TypeExtensions.dll のアセンブリに TypeExtensions を指定します。
署名されたアセンブリの完全な名前。単純な名前、バージョン、カルチャ、および公開キー トークンで構成されます。たとえば、「TypeExtensions、Version=1.0.0.0、Culture=neutral、PublicKeyToken=181869f2f7435b51」などです。
具体的には、アセンブリ「SquidReports.DataCollector.Plugin.BES」で定義されたクラス「Action」のインスタンスを作成しようとしています。インスタンスを作成しようとしているのとまったく同じ *.cs ファイルの先頭で、このアセンブリをusingディレクティブとして明示的に参照しています。
以前の質問/回答から次の提案を試しました。
ソリューションを一掃し、再構築して再試行してください。これは一部の ASP.NET プロジェクトでは機能するようですが、これは単純な古いコンソール アプリです。
構成ファイルで参照されているアセンブリを確認してください 繰り返しますが、これは同じソリューションの異なるプロジェクトで GAC とライブラリのみを使用する単純なコンソール アプリです
1. アセンブリが正しい作業ディレクトリにあることを確認します。
ここにいる...
2.アセンブリがディスク上の同じバージョンであることを確認します
うん...
3. 最後の推奨事項は、fuslogvw.exe を使用することでした。
ツールを使用した経験はありませんが、奇妙なことが 1 つあります。デバッグ セッションを実行すると、アセンブリの長い名前と短い名前の両方のバージョンが表示されました。
両方のログを見ました。
短い名前のバージョンは、いくつかの警告を生成するようです:
=== プレバインド状態情報 ===
ログ: DisplayName = SquidReports.DataCollector.Plugin.BES Partial) WRN: アセンブリの部分バインディング情報が提供されました:
WRN: アセンブリ名: SquidReports.DataCollector.Plugin.BES | ドメイン ID: 1
WRN: アセンブリの表示名の一部のみを指定すると、部分バインドが発生します。
WRN: これにより、バインダーが不適切なアセンブリをロードする可能性があります。
WRN: アセンブリに完全に指定されたテキスト ID を提供することをお勧めします。
WRN: 単純な名前、バージョン、カルチャ、および公開キー トークンで構成されます。
WRN:この問題の詳細と一般的な解決策については、ホワイト ペーパーhttp://go.microsoft.com/fwlink/?LinkId=109270を参照してください。
...しかし、正常にロードされて終了し、アセンブリが正しい場所にあることを明確に示しています。
ログ: 新しい URL ファイルのダウンロードを試みています:///C:/Source/C#/SquidReports/SquidReports.DataCollector/bin/x86/Debug/SquidReports.DataCollector.Plugin.BES.DLL。
長い名前のバージョンのログには、疑わしいメッセージは含まれていません。
他にアイデアはありますか?
EDIT : Action クラスの最小限の定義を次に示します。純粋にモデルクラスです。
public class Action : ICollectible
{
public Action()
{
// Empty constructor
}
public Action(int actionID, string siteID, string name)
{
this.ActionID = actionID;
this.SiteID = siteID;
this.Name = name;
}
public int ID { get; set; } // Identity ID assigned by DB
[Key]
public int ActionID { get; set; } // Identity ID assigned by API
public string SiteID { get; set; }
public string Name { get; set; }
}
ICollectible インターフェイスと [Key] 属性は、さらに別のアセンブリの一部です。それが効果があるかどうかわからない?
編集 2: Erik が以下で指摘しているように、明らかに、この OTHER アセンブリでもまったく同じチェックを行いました。