Проблема загрузки класса из сборки.
От: dmitriy2004  
Дата: 18.04.04 14:41
Оценка:
Необходимо загрузить класс из сборки с помощью метода 1 и метода 2.
Хочется, что бы при загрузке приведение типов производилось к одному типу.
Но если грузить класс по методу 1, приходится приводить объект к типу класса
abc::TestClass1, для того, что бы воспользоваться методами класса abc::TestClass1.
А если грузить класс по методу 2, приходится приводить объект к типу интерфейса
abc::ITest.
Если в методе 1 сделать приведение к типу интерфейса abc::ITest, то при вызове
метода генерируется исключение Exception::NullReferenceException.
Если в методе 2 сделать приведение к типу класса abc::TestClass1, то вызов
методов, при выполнении программы, вообще не происходит.
Просветите, пожалуйста, как сделать загрузку класса с приведением к одному типу
и почему не работает приведение в методе 1 к abc::ITest, и приведение к abc::TestClass1
в методе 2?

// Метод 1
abc::TestClass1 *t1 = static_cast<abc::TestClass1 *>(Activator::CreateInstance("abc", "abc.TestClass1")->Unwrap() );
if ( t1 != NULL ) {

t1->OpenTest ( );

t1->CloseTest ( );
}

// Метод 2
// Создание домена для сборки
System::AppDomain * pDomain = System::AppDomain::CreateDomain( "abcDomain" );
if ( pDomain != NULL ) {

abc::ITest *t2 = static_cast<abc::ITest *>(pDomain->CreateInstanceAndUnwrap( "abc", "abc.TestClass1" ));
if ( t2 != NULL ) {

Console::WriteLine( "Not NULL" );
t2->OpenTest ( );
t2->CloseTest ( );
}

t2 = NULL;

System::AppDomain::Unload( pDomain );
pDomain = NULL;
}

// Текст сборки
#using <mscorlib.dll>

using namespace System;

namespace abc
{
public __gc __interface ITest {
public:
virtual void OpenTest ( ) = 0;
virtual void CloseTest ( ) = 0;
};

public __gc class TestClass1 : public System::MarshalByRefObject
,public ITest
{
public:
TestClass1 ( )
{
Console::WriteLine( "Constructor" );
m_pString = new String("Hello");
}
virtual ~TestClass1 ( )
{
Console::WriteLine( "Destructor" );
}

virtual void OpenTest ( ) { m_pString = "OpenTest"; Console::WriteLine( m_pString ); }
virtual void CloseTest ( ) { m_pString = "CloseTest"; Console::WriteLine( m_pString ); }

public:
String * m_pString;
};
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.