C#中的InvalidCastException,DLL和反射问题

时间:2012-10-07 00:15:00

标签: c# reflection dll interface .net

我正在尝试使用带反射的预编译DLL来实例化DLL中的类的接口。我试过这本书,但它不起作用。当我尝试执行以下操作时,它会抛出InvalidCastException:

ICompute iCompute = (ICompute)Activator.CreateInstance(type);

其中类型的课程是我的类,它实现了ICompute接口。我被困住了,不知道该怎么办。完整的代码如下:

这是DLL内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication18
{
    public class ClassThatImplementsICompute : ICompute
    {
       public int sumInts(int term1, int term2)
       {
           return term1 + term2;
       }

       public int diffInts(int term1, int term2)
       {
           return term1 - term2;
       }
    }
}

实际节目:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Reflection;

namespace ConsoleApplication18
{

    public interface ICompute
    {
        int sumInts(int term1, int term2);
        int diffInts(int term1, int term2);
    }



    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Loading dll...");
            Assembly assembly = Assembly.LoadFrom("mylib.dll");

            Console.WriteLine("Getting type...");
            Type type = assembly.GetType("ConsoleApplication18.ClassThatImplementsICompute");
            if (type == null) Console.WriteLine("Could not find class type");

            Console.WriteLine("Instantiating with activator...");
            //my problem!!!
            ICompute iCompute = (ICompute)Activator.CreateInstance(type);

            //code that uses those functions...



        }
    }
}

任何人都可以帮助我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于如何使用Assembly.LoadFrom()加载程序集。

与您尝试强制转换的LoadFrom()接口的上下文相比,

ICompute将程序集加载到不同的上下文中。如果可能,请尝试使用Assembly.Load()。即将程序集放入bin / probing path文件夹并以完整的强名称加载。

一些参考文献: http://msdn.microsoft.com/en-us/library/dd153782.aspx http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx(请参阅LoadFrom的不利位置)