`
380071587
  • 浏览: 480072 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C#动态方法调用

 
阅读更多

此篇将介绍C#如何在运行时动态调用方法。当某些类型是运行时动态确定时,编译时的静态编码是无法解决这些动态对象或类的方法调用的。此篇则给你一把利剑,让动态对象的方法调用成为可能。

1.动态调用dll里的方法

/// <summary>
/// 该类将被独立编入Class1.dll汇编
/// </summary>
class Class1
{
    public static string method1()
    {
        return "I am Static method (method1) in class1";
    }
    public string method2()
    {
        return "I am a Instance Method (method2) in Class1";
    }
    public string method3(string s)
    {
        return "Hello " + s;
    }
}

/// <summary>
/// 该类独立放入Test.exe汇编
/// </summary>
class DynamicInvoke
{
    public static void Main(string[] args)
    {
        // 动态加载汇编
        string path = "Class1.dll";
        Assembly assembly = Assembly.Load(path);

        // 根据类型名得到Type
        Type type = assembly.GetType("Class1");

        // 1.根据方法名动态调用静态方法
        string str = (string)type.InvokeMember("method1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] { });
        Console.WriteLine(str);

        // 2.根据方法名动态调用动态对象的成员方法
        object o = Activator.CreateInstance(type);
        str = (string)type.InvokeMember("method2", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { });
        Console.WriteLine(str);

        // 3.根据方法名动态调用动态对象的有参成员方法
        object[] par = new object[] { "kunal" };
        str = (string)type.InvokeMember("method3", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, par);
        Console.WriteLine(str);

        // 带out修饰的InvokeMember
        // System.Int32 中 public static bool TryParse(string s, out int result) 方法的调用
        var arguments = new object[] { str, null }; // 注意这里只能将参数写在外面,out参数为null也没有关系
        typeof(int).InvokeMember("TryParse", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static,
             null, null, arguments);
        Console.WriteLine(arguments[1]);
    }
}

2.动态加载类文件并调用方法:

using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Windows.Forms;
using Microsoft.CSharp;

namespace _32.DynamicReflection
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            #region 内置标签方法 (动态加载)

            const string className = "DynamicReflection.Test"; //类名称一定要全称
            string fileName = Thread.GetDomain().BaseDirectory + "Test.cs";

            if (File.Exists(fileName))
            {
                var sourceFile = new FileInfo(fileName);
                CodeDomProvider provider = new CSharpCodeProvider();
                var cp = new CompilerParameters();
                cp.ReferencedAssemblies.Add("System.dll"); //添加命名空间引用  

                cp.GenerateExecutable = false; // 生成类库 
                cp.GenerateInMemory = true; // 保存到内存 
                cp.TreatWarningsAsErrors = false; // 不将编译警告作为错误

                // 编译
                CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile.FullName);
                if (cr.Errors.Count < 1)
                {
                    Assembly asm = cr.CompiledAssembly; // 加载 

                    //1.调用静态方法
                    Type type = asm.GetType(className);
                    var str =(string)type.InvokeMember("SayHello1", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, new object[] {});
                    Console.WriteLine(str);

                    //2.调用实例方法
                    object instance = asm.CreateInstance(className);
                    str =(string)type.InvokeMember("SayHello2", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,new object[] {});
                    Console.WriteLine(str);

                    //3.调用带参数的方法
                    var par = new object[] {"zhangqs008"};
                    str =(string)type.InvokeMember("SayHello3", BindingFlags.Default | BindingFlags.InvokeMethod, null, instance,par);
                    Console.WriteLine(str);

                    Console.Read();
                }
                else
                {
                    string msg = null;
                    for (int index = 0; index < cr.Errors.Count; index++)
                    {
                        CompilerError error = cr.Errors[index];
                        msg += "【错误" + (index + 1) + "】" + Environment.NewLine;
                        msg += "[文件] " + error.FileName + Environment.NewLine;
                        msg += "[位置] 行" + error.Line + ",列" + error.Column + Environment.NewLine;
                        msg += "[信息] " + error.ErrorText + Environment.NewLine;
                        msg += Environment.NewLine;
                    }
                    MessageBox.Show(msg, "内置方法类编译错误");
                }
            }

            #endregion
        }
    }
}
类文件:

namespace DynamicReflection
{
    public class Test
    {
        public static string SayHello1()
        {
            return "hello static method";
        }

        public string SayHello2()
        {
            return "hello instance method";
        }

        public string SayHello3(string args)
        {
            return "hello args " + args;
        }
    }
}



分享到:
评论

相关推荐

    C#动态调用类方法

    1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用

    bartender 10.0 C#动态调用DLL

    在.NET框架下,C#可以使用`System.Reflection`命名空间的类,如`Assembly`和`Type`,来动态加载和调用DLL中的方法。这种方法允许程序在运行时决定要执行哪个特定的DLL功能,增强了代码的灵活性。 1. **加载DLL**:...

    C#动态库调用例子(源码)

    2. **DllImport 属性**: 在C#中,要调用非托管函数,通常会在方法声明前使用`[DllImport]`特性,指定DLL的路径和函数名。例如: ```csharp [DllImport("kernel32.dll")] public static extern bool Beep(uint ...

    C#动态调用Dll中的方法

    本主题将深入探讨如何利用C#的反射特性来动态调用DLL(动态链接库)中的方法。首先,我们需要了解什么是DLL以及它在程序中的作用。 DLL(Dynamic Link Library)是Windows操作系统中的一个共享库,它包含了一组可...

    C#动态调用WebService服务

    本文将深入探讨如何在C#中实现动态调用WebService服务,主要涉及"反射"和"动态调用"这两个核心概念。 首先,我们要理解什么是WebService。WebService是一种基于开放标准(如SOAP、WSDL和UDDI)的,可以在不同操作...

    C#动态调用DLL并对目标函数传递参数

    通过学习和理解这个例子,你可以更好地掌握C#动态调用DLL的方法。 总结起来,C#动态调用DLL并传递参数是一个涉及反射、委托和类型转换的过程,对于需要在运行时根据条件选择功能或处理不固定接口的情况非常有用。...

    js调用C#方法

    ### JS调用C#方法及C#调用JS方法详解 在Web开发中,前后端交互是必不可少的一个环节。本文将详细介绍如何实现前端JavaScript(JS)与后端C#之间的相互调用,这对于构建功能丰富的Web应用至关重要。下面将按照问题的...

    C#_.NET_动态调用webservice的三种方式

    C# _.NET_动态调用webservice的三种方式 在本文中,我们将讨论如何动态调用WebService的三种方式。在某些情况下,我们可能需要在程序运行期间动态调用一个未知的服务。这可以通过使用.NET Framework的System.Web....

    Electron 调用C# 动态库DLL

    总的来说,`Electron 调用C# 动态库DLL`这个主题涉及到的技术栈包括Electron桌面应用开发、Node.js环境下的C#调用、Vue.js前端框架(如果`vue.config.js`的存在表明了项目使用Vue.js)、以及Babel的代码转换。...

    C#调用java程序的方法

    C#调用Java程序的方法 C#调用Java程序的方法是指将Java类转化成dotnet类,在C#项目直接调用。这种方法可以使得C#项目可以调用Java类的方法,从而实现C#和Java之间的交互。 在这个过程中,我们需要使用IKVM(ynamic...

    C#Winform动态调用C++和C#的Dll

    本文将重点讲解如何在C#的Winform应用中动态调用C++和C#编写的DLL,并将DLL作为嵌入资源处理,避免因丢失DLL文件而引发的问题。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用程序...

    C# dll的调用(动态链接库创建与使用)

    总的来说,C#中的DLL调用是一个强大的工具,它允许开发者复用代码,提高效率,并且通过动态链接库,可以实现模块化开发,使得系统更加灵活和可维护。在实际开发中,理解并掌握DLL的创建与调用是提升软件工程能力的...

    C#动态载入的DLL,并调用成员方法(提供非接口及接口调用两种方式)

    C#动态载入DLL,DLL中类方法调用,及采用接口方式调用DLL的类方法和获取类成员属性。含示例代码及程序运行截图。

    C#调用C++的动态库Dll示例(含UsbLibDotNet使用)

    1.C#调用C++封装的动态库dll 2.结构体含union共同体的C++转C#示例 3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装...

    C#动态静态调用C++ dll

    - **步骤2**:在C++/CLI项目中,使用`ref class`或`public ref class`声明托管类,暴露需要被C#调用的接口。 - **步骤3**:在C#项目中,添加对C++/CLI项目的引用,然后像调用普通的.NET类一样调用这些接口。 在`...

    C#调用C++动态DLL

    在C#中调用C++编写的动态链接库(DLL)是一种常见的跨语言通信方式,特别是当C++库提供了某些C#中没有的功能或者优化的性能时。本文将详细探讨如何在C#中实现对C++动态DLL的调用。 首先,了解动态链接库(DLL)的...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#动态调用CXF WEBSERVICE框架的共通类

    C#动态调用CXF WEBSERVICE框架共通类。

    C#程序实现动态调用DLL

    从DLL的基本概念出发,探讨了C#调用非托管DLL的具体步骤,以及在实际开发中可能遇到的一些注意事项。同时,还提到了一种改进的方案,即将DLL作为资源文件直接嵌入到程序中,以提高程序的启动效率。这些知识点对于...

    C#动态调用webservice

    本文将详细讲解如何利用C#动态调用WebService,以便在IIS(Internet Information Services)环境中实现更灵活的应用配置。 首先,我们要理解什么是WebService。WebService是一种基于XML的开放标准,它允许不同系统...

Global site tag (gtag.js) - Google Analytics