トップ回答者
DLLの呼出しでキャスト例外

質問
-
はじめまして。
私が今現在DLLをAssembly::LoadFromで読込みして実行するプログラムを作成しております。
内容は以下の2種(本体=dllload.cpp、DLL=testdll.cpp)で、実際のものを簡略化しました。
これを実行すると, 本体の12行目「IeaAccess^ iea = safe_cast...」で「型'xBrkIf.eaAccessのオブジェクトを型'xBrkIf.IeaAccess'にキャストできません」という例外が発生します。
使用開発環境はVisual Studio 2008のVisual C++, .NET Framework 3.5です。
どのようにすれば例外が解消できるかご指導いただけたら幸いです。
宜しくお願い致します。
----------[dllload.cpp]----------------------
#include "testdll.cpp"
using namespace System;
using namespace System::Reflection;
using namespace xBrkIf;void main(void)
{
try
{
Assembly^ a = Assembly::LoadFrom("DLLのパスが入る");
Object^ obj = a->CreateInstance("xBrkIf.eaAccess");
IeaAccess^ iea = safe_cast<IeaAccess^>(obj);
iea->message("Hello World.");
}catch (Exception^ ee)
{
Console::WriteLine(ee->Message);
}
}----------[testdll.cpp]----------------------
using namespace System;
namespace xBrkIf
{
public interface class IeaAccess
{
public:
void message(String^ mes);
};
public ref class eaAccess : public IeaAccess
{
public:
virtual void message(String^ mes)
{
Console::WriteLine("{0}", mes);
}
};
}
回答
-
普通、cpp ファイルを include することはしません。
cpp ファイルを include したため、dllload.exe と testdll.dll の両方に IeaAccess インターフェイスおよび eaAccess クラスが作られています。
.NET の型システムは型の同一性をアセンブリの違いも含めて判断しますので、dllload.exe にある IeaAccess インターフェイスと testdll.dll にある IeaAccess インターフェイスは別物です。たまたま名前空間および型名が同じになっていますが。
testdll.dll の eaAccess は testdll.dll のIeaAccess を実装しますが当然ながら dllload.exe の IeaAccess は実装していないのでキャストはできません。
一般的には、dllload.exe および testdll.dll の両方から第三の dll を参照させ、その第三の dll に IeaAccess を定義します。
すべての返信
-
普通、cpp ファイルを include することはしません。
cpp ファイルを include したため、dllload.exe と testdll.dll の両方に IeaAccess インターフェイスおよび eaAccess クラスが作られています。
.NET の型システムは型の同一性をアセンブリの違いも含めて判断しますので、dllload.exe にある IeaAccess インターフェイスと testdll.dll にある IeaAccess インターフェイスは別物です。たまたま名前空間および型名が同じになっていますが。
testdll.dll の eaAccess は testdll.dll のIeaAccess を実装しますが当然ながら dllload.exe の IeaAccess は実装していないのでキャストはできません。
一般的には、dllload.exe および testdll.dll の両方から第三の dll を参照させ、その第三の dll に IeaAccess を定義します。