Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 447)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Delegate.cpp	(revision 448)
@@ -20,4 +20,22 @@
 		}
 	}
+}
+
+bool Delegate::IsSimilar( const Delegate &dgt ) const
+{
+	if( this->Params().Equals( dgt.Params(), true ) )			// パラメータが等しい、もしくは反変
+	{
+		if( this->returnType.Equals( dgt.returnType ) )
+		{
+			// 戻り値が等しい
+			return true;
+		}
+		else if( this->returnType.IsCovariant( dgt.returnType ) )
+		{
+			// 戻り値が共変
+			return true;
+		}
+	}
+	return false;
 }
 
@@ -149,4 +167,10 @@
 		const Delegate &dg = *this->Iterator_GetNext();
 
+		if( !dg.isTargetObjectModule )
+		{
+			// 静的リンクライブラリの場合は飛ばす（既にインスタンスが定義済みであるため）
+			continue;
+		}
+
 		std::map<std::string,std::string> values;
 
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 447)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Meta.cpp	(revision 448)
@@ -152,3 +152,13 @@
 	}
 	meta.procPointers.PullOutAll();
+
+	// デリゲート
+	meta.GetDelegates().Iterator_Reset();
+	while( meta.GetDelegates().Iterator_HasNext() )
+	{
+		Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext();
+		pDelegate->isTargetObjectModule = false;
+		this->GetDelegates().Put( pDelegate );
+	}
+	meta.GetDelegates().PullOutAll();
 }
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp	(revision 447)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Parameter.cpp	(revision 448)
@@ -2,5 +2,5 @@
 
 
-bool Parameter::Equals( const Parameter &param ) const
+bool Parameter::Equals( const Parameter &param, bool isContravariant ) const
 {
 	if( Type::Equals( param ) )
@@ -25,9 +25,19 @@
 	}
 
+	if( isContravariant )
+	{
+		// 反変引数を許可する
+		if( this->IsContravariant( param ) )
+		{
+			// 反変引数だったとき
+			return true;
+		}
+	}
+
 	return false;
 }
-bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param ) const
-{
-	if( Equals( param ) )
+bool Parameter::Equals( const Types &actualTypeParametersForThisProc, const Parameter &param, bool isContravariant ) const
+{
+	if( Equals( param, isContravariant ) )
 	{
 		return true;
@@ -47,5 +57,5 @@
 }
 
-bool Parameters::Equals( const Parameters &params ) const
+bool Parameters::Equals( const Parameters &params, bool isContravariant ) const
 {
 	if( this->size() != params.size() ){
@@ -55,5 +65,5 @@
 	int max = (int)this->size();
 	for( int i=0; i<max; i++ ){
-		if( !(*this)[i]->Equals( *params[i] ) ){
+		if( !(*this)[i]->Equals( *params[i], isContravariant ) ){
 			return false;
 		}
@@ -62,5 +72,5 @@
 	return true;
 }
-bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params ) const
+bool Parameters::Equals( const Types &actualTypeParametersForThisProc, const Parameters &params, bool isContravariant ) const
 {
 	if( this->size() != params.size() ){
@@ -70,5 +80,5 @@
 	int max = (int)this->size();
 	for( int i=0; i<max; i++ ){
-		if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i] ) ){
+		if( !(*this)[i]->Equals( actualTypeParametersForThisProc, *params[i], isContravariant ) ){
 			return false;
 		}
Index: trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp
===================================================================
--- trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 447)
+++ trunk/ab5.0/abdev/BasicCompiler_Common/src/Type.cpp	(revision 448)
@@ -161,4 +161,14 @@
 
 	return this->GetClass().IsSubClass( &type.GetClass() );
+}
+bool Type::IsContravariant( const Type &type ) const
+{
+	if( !this->IsObject() || !type.IsObject() )
+	{
+		// 反変性の判別はクラス型のみ
+		return false;
+	}
+
+	return type.GetClass().IsSubClass( &this->GetClass() );
 }
 
