有两个dll即 a)lib1 b)lib2 这两个库使用反射加载(而不是在visual studio中添加直接引用)。我正在创建一个类的对象,然后想要将该对象类型转换为接口的类型(接口在主程序中加载的dll中)。我收到一个错误,说类型不匹配。任何可能解决这个问题的方法。
这是我的代码块:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace Interfaceconversion
{
class Program
{
public static object classobj;
public static object interfaceobj;
static void Main(string[] args)
{
// Loading assembley 1
Assembly assembly1 = Assembly.LoadFrom(@"D:\WCFService\Aug9\Interfaceconversion\Lib1\bin\Debug\Lib1.dll");
Type[] type1 = assembly1.GetTypes();
foreach (Type item in type1)
{
if (item.FullName.ToString() == "Lib1.Class1")
{
classobj = Activator.CreateInstance(item);
}
}
// Loading assembly 2
Assembly assembly2 = Assembly.LoadFrom(@"D:\WCFService\Aug9\Interfaceconversion\Lib2\bin\Debug\Lib2.dll");
Type[] type2 = assembly2.GetTypes();
Type libtype = type2[1];
foreach (Type item in type2)
{
if (item.FullName.ToString() == "Lib2.Ilib2Interface1")
{
TODO: cast the object "classobj " to type Lib2.Ilib2Interface1
interfaceobj = classobj as item ;
}
}
#region old code
}
}
Lib2 dll的代码是: lib2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lib2
{
interface Ilib2Interface1
{
void lib2disp1();
}
}
Lib1代码是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lib1
{
interface ISttutil
{
void displayutil1();
void displayutil2();
}
interface Isttinterface
{
void displayinterface1();
void displayinterface2();
}
}
答案 0 :(得分:1)
我们在给出的示例中没有看到lib1.Class1,但是如果它是从您想要将其强制转换的接口派生的,那么这样的东西应该可以工作:
LIB1:
using lib2;
using System;
namespace lib1
{
public class Class1 : IInterface1
{
public void MethodOne ( )
{
Console.WriteLine ( "MethodOne called!" );
}
}
}
LIB2:
namespace lib2
{
public interface IInterface1
{
void MethodOne ( );
}
}
主:
using lib2;
using System;
using System.IO;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main ( string [ ] args )
{
var fileInfo = new FileInfo ( @".\lib1.dll" );
var assembly = Assembly.LoadFile ( fileInfo.FullName );
var obj = assembly.CreateInstance ( "lib1.Class1" ) as IInterface1;
if ( obj != null ) obj.MethodOne ( );
Console.ReadLine ( );
}
}
}