C#反射实用程序

时间:2009-09-12 20:58:26

标签: c# .net reflection

我编写了以下Utility类来获取任何类名“className”的实例。

public class AssemblyUtils
    {
        private AssemblyUtils()
        {
        }

        public static T GetInstance<T>(string assemblyName, string className)
        {
            T classInstance = default(T);

            System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(assemblyName);

            object o = assembly.CreateInstance(className);

            if (o is T)
            {
                classInstance = (T)o;
            }
            else
            {
                o = null;
            }


            return classInstance;
        }

我称之为:

IMyInterface ins = AssemblyUtils.GetInstance<IMyInterface>(@"MyNamespace.DA.dll", "MyClassDA");

但是我收到以下错误消息:

Could not load file or assembly 'MyNamespace.DA.dll' or one of its dependencies. The system cannot find the file specified.

请注意,我从处于同一sln的单独程序集中调用了AssemblyUtils.GetInstance()。

如何解决装配路径???

4 个答案:

答案 0 :(得分:5)

我的猜测是它找不到汇编,因为它不在同一个文件夹中,也不在GAC或系统正在寻找的其他目录中。

您需要将它们移动到执行程序集所在的同一文件夹中。您可以使用AppDomainSetup.PrivateBinPath Property更改装入程序集的文件夹。

答案 1 :(得分:1)

我认为,您要加载的程序集(MyNamespace.DA.dll)依赖于另一个程序集,该程序集不在您正在查找的文件夹中。将依赖程序集复制到您找到MyNamespace.DA.dll程序集的文件夹中。

答案 2 :(得分:1)

检查你的bin \ Debug文件夹,该文件夹中的MyNamespace.DA.dll是什么?如果不是,你将不得不手动移动它。也许添加一个后置条件,以便自动复制。还可以尝试使用完整的程序集强名称。

同样是JMSA,你的另一个帖子上有些赞成和接受答案怎么样?

答案 3 :(得分:1)

Vadim提到了Assembly.Load只会在一组有限的地方看。 Assembly.LoadFrom可能是一个更好的选择。它需要一个路径(带文件名)到程序集。

Assembly.Load使用程序集名称,而不是路径。