Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用反射调用方法_C#_C# 4.0_Reflection_Dll_Dllimport - Fatal编程技术网

C# 用反射调用方法

C# 用反射调用方法,c#,c#-4.0,reflection,dll,dllimport,C#,C# 4.0,Reflection,Dll,Dllimport,我创建了一个类库项目并构建了它。现在我将Dll复制到“C:\”。现在我想用反射打开此Dll: using System.Reflection; byte[] assem = System.IO.File.ReadAllBytes(@"c:\Company.dll"); var loadedAssem = Assembly.Load(assem); Type thePersonType = loadedAssem.GetType();

我创建了一个类库项目并构建了它。现在我将Dll复制到“C:\”。现在我想用反射打开此Dll:

using System.Reflection;

        byte[] assem = System.IO.File.ReadAllBytes(@"c:\Company.dll");
        var loadedAssem = Assembly.Load(assem);
        Type thePersonType = loadedAssem.GetType();
        var theObj = loadedAssem.CreateInstance("Company.Person");
        // or  var theObj = loadedAssem.CreateInstance("Company.Person")as IPlugin ;
        Type[] paramTypes = new Type[1];
        paramTypes[0] = Type.GetType("System.String");
        MethodInfo PersonInfo = thePersonType.GetMethod("FullName", paramTypes);
        Object[] parameters = new Object[1];
        parameters[0] = "Mr. ";
        Object returnVal = PersonInfo.Invoke(theObj, parameters);
        MessageBox.Show(returnVal.ToString());
我不能调用我的“全名”方法。 这是我的界面:

public interface IPlugin
{
    String FullName(String PreName);
}
这是我的DLL中的Person类:

public class Person:IPlugin
{
    public int PersonID { get; set; }
    public String PersonName { get; set; }
    public String PersonLName { get; set; }
    public String FullName(String PreName)
    {
        return PreName+this.PersonName + this.PersonLName;
    }
}

您的问题在这一行:

Type theMathType = loadedAssem.GetType();
MathType是程序集,因此它不实现全名

你应该做:

Type theMathType = loadedAssem.GetType("Company.Person");
顺便说一句,如果您使用以下方法实例化theObj:

IPlugin theObj = Activator.CreateInstance(theMathType) as IPlugin;
然后您可以简单地编写(无需使用反射来调用该方法):


您的问题在这一行:

Type theMathType = loadedAssem.GetType();
MathType是程序集,因此它不实现全名

你应该做:

Type theMathType = loadedAssem.GetType("Company.Person");
顺便说一句,如果您使用以下方法实例化theObj:

IPlugin theObj = Activator.CreateInstance(theMathType) as IPlugin;
然后您可以简单地编写(无需使用反射来调用该方法):


您正在调用
GetType()
,它将
Assembly
作为类型返回。这显然不是你要找的类型。要枚举程序集中声明的类型,请使用
assembly.GetTypes()
方法。
要查找实现
IPlugin
的所有类型,可以使用以下代码:

Type[] iPluginTypes = (from t in loadedAssem
                       where !t.IsInterface && !t.IsAbstract
                       where typeof(IPlugin).IsAssignableFrom(t)
                       select t).ToArray();
另外(如果还没有这样做的话),我建议您在一个程序集中声明接口
IPlugin
,这个程序集可以被加载插件的代码以及插件本身访问(可能是一个单独的程序集,仅用于类似的可扩展性类型)


这样,您就可以将结果强制转换到接口并正常使用它。必须使用反射调用接口方法,这有点违背了需要这样一个接口的目的

您正在调用
GetType()
,它将
Assembly
作为类型返回。这显然不是你要找的类型。要枚举程序集中声明的类型,请使用
assembly.GetTypes()
方法。
要查找实现
IPlugin
的所有类型,可以使用以下代码:

Type[] iPluginTypes = (from t in loadedAssem
                       where !t.IsInterface && !t.IsAbstract
                       where typeof(IPlugin).IsAssignableFrom(t)
                       select t).ToArray();
另外(如果还没有这样做的话),我建议您在一个程序集中声明接口
IPlugin
,这个程序集可以被加载插件的代码以及插件本身访问(可能是一个单独的程序集,仅用于类似的可扩展性类型)


这样,您就可以将结果强制转换到接口并正常使用它。必须使用反射调用接口方法,这有点违背了需要这样一个接口的目的

我用这段代码解决了这个问题。我们应该在一个单独的类库中使用接口“IPlugin”,并在其他项目中使用

        Assembly objAssembly = Assembly.LoadFrom("Company.dll");
        Type objAssemblyType = objAssembly.GetType();

        foreach (Type type in objAssembly.GetTypes())
        {
            if (type.IsClass == true)
            {
                var classInstance = objAssembly.CreateInstance(type.ToString()) as IPlugin;
                lblFullName.Text = classInstance.FullName("Mr. ");

            }
        }

我用这段代码解决了这个问题。我们应该在一个单独的类库中使用接口“IPlugin”,并在其他项目中使用

        Assembly objAssembly = Assembly.LoadFrom("Company.dll");
        Type objAssemblyType = objAssembly.GetType();

        foreach (Type type in objAssembly.GetTypes())
        {
            if (type.IsClass == true)
            {
                var classInstance = objAssembly.CreateInstance(type.ToString()) as IPlugin;
                lblFullName.Text = classInstance.FullName("Mr. ");

            }
        }

当你说它不起作用时,它在哪个阶段失败了?您是否正在逐步检查代码,以查看什么时候出现了不符合预期的情况?如果是这样的话,错误是什么等等。当你说它不工作时,它在哪个阶段失败了?您是否正在逐步检查代码,以查看什么时候出现了不符合预期的情况?如果是,错误是什么等等…“;-)"" ;-)我使用这个,但是当我创建实例时,用null填充“theObj”。我使用这个,但是当我创建实例时,用null填充“theObj”。