C#利用反射动态调用DLL并返回结果,和获取程序集的信息

反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息

创建Assembly和Entity两个程序集,在Assembly中添加Entity引用,如下图:

namespace Entity
{
    public class GetData
    {
        public static SIMPEntities SIMP = new SIMPEntities();

        /// <summary>
        /// 查询方法--返回序列化json
        /// </summary>
        /// <returns></returns>
        public string GetResule()
        {
            JavaScriptSerializer Serialize = new JavaScriptSerializer();
            var list = SIMP.Sys_Employee
                .Select(a => new { id = a.EmpId, EmpName = a.EmpName, PositionName = (a.Sys_Position!=null)?a.Sys_Position.PositionName:"无" })
                .ToList();
            return Serialize.Serialize(list);
        }
    }
}
namespace AssemblyTest
{
    class Program
    {
        private static Program pro = new Program();
        static void Main(string[] args)
        {
            pro.GetAssemblyInfo();

            pro.LoadAssembly();
            Console.ReadLine();
        }
        /// <summary>
        /// 动态读取DLL,执行其中的方法
        /// </summary>
        public void LoadAssembly()
        {
            //DLL所在的绝对路径
            Assembly assembly = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "Entity.dll");
            //注意写法:程序集.类名
            Type type = assembly.GetType("Entity.GetData");
            //获取类中的公共方法GetResule
            MethodInfo methed = type.GetMethod("GetResule");
            //创建对象的实例
            object instance = System.Activator.CreateInstance(type);
            //执行方法  new object[]为方法中的参数
            object result = methed.Invoke(instance, new object[] { });
        }
        /// <summary>
        /// //获取程序集信息
        /// </summary>
        public void GetAssemblyInfo()
        {
            Type type = typeof(Program);
            Assembly assembly = Assembly.GetExecutingAssembly();
            Console.WriteLine("命名空间:{0}", type.Namespace);
            Console.WriteLine("程序集:{0}", type.Assembly);
            Console.WriteLine("类的名字{0}", type.Name);
            Console.WriteLine("类的全部名字{0}", type.FullName);
            Console.WriteLine("基类:{0}", type.BaseType);
            Console.WriteLine("----------------------------");
            Console.WriteLine("程序集的名称:{0}", assembly.GetName());
            Console.WriteLine("程序集的全名:{0}", assembly.FullName);
            Console.WriteLine("程序集的版本:{0}", assembly.GetName().Version);
            Console.WriteLine("程序集的位置:{0}", assembly.Location);
            Console.WriteLine("程序集所在目录:{0}", AppDomain.CurrentDomain.BaseDirectory);
        }
    }
}
时间: 2024-12-31 05:55:35

C#利用反射动态调用DLL并返回结果,和获取程序集的信息的相关文章

C#反射动态调用dll中的方法,并返回结果

//加载程序集(dll文件地址),使用Assembly类 Assembly assembly = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Bin/App_Code.dll"); //获取类型,参数(名称空间+类) Type type = assembly.GetType("assembly_name.assembly_class"); //创建该对象的实例,object类型,参数(名称空间

http请求POST和GET调用接口以及反射动态调用Webservices类

此代码是API.WebSrvices动态调用的类,做接口调用时很实用. Webservices动态调用使用反射的方式很大的缺点是效率低,若有更好的动态调用webservices方法,望各位仁兄不吝贴上代码. using System; using System.IO; using System.Net; using System.Text; using System.Web; using System.Collections.Generic; using System.CodeDom.Compi

C#程序实现动态调用DLL的研究(转)

摘 要:在<csdn开发高手>2004年第03期中的<化功大法——将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动

C#程序实现动态调用DLL的研究

原文:C#程序实现动态调用DLL的研究 摘  要:在<csdn开发高手>2004年第03期中的<化功大法--将DLL嵌入EXE>一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决"DLL Hell"提供了一种解决方案.这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛

C#程序实现动态调用DLL的研究[转]

摘   要: 在< csdn 开发高手> 2004 年第 03 期中的<化功大法——将 DLL 嵌入 EXE >一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“ DLL Hell ”提供了一种解决方案.这是一个很好的设计思想,而且该作者也用 C++ 实现了,在 Internet 上也有相似的 VB 程序,但在某一技术论坛上提起这种设计方法时

MVVM下 利用反射动态创建ViewModel 实现单例

在MVVM一般情况下都会希望ViewModel 在整个应用程序中只有一份实例 传统的做法是用单例模式去实现 : public class ViewModelTest { private ViewModelTest() { } private static ViewModelTest viewModelInstace; public static ViewModelTest GetViewModelTestInstace() { if (viewModelInstace == null) { vi

动态调用DLL函数有时正常,有时报Access violation的异常

动态调用DLL函数有时正常,有时报Access violation的异常 typedef int (add *)(int a,int b); void test() { hInst=LoadLibraryA("aimdtl.dll"); (FARPROC &)add=GetProcAddress(hInst,"add"); add(1,2); } 按这个代码执行,add函数有时OK,有时报Access violation的异常.看到提示,第一反应就是内存异常

利用反射动态加载程序集中所有的继承于Form的子类

利用C# 的反射,能够轻松快捷的创建指定类型的未知对象,比如继承某个接口的类,继承于某个基类的子类. 问题场景: 我自己创建一个解决方案,这个方案里面放了很多的小工具,每一个工具都是一个小窗体,于是,我就用一个MID窗体来包含这些窗体. 这样问题就来了,每一次我添加一个小工具,我就必须在MID窗体里面添加一个按钮,或者是一个菜单.在事件写上,让某个窗体显示出来.这类无聊的语句. 那么能不能让程序自动查找程序集中的窗体,自动创建按钮,或者菜单. 这样就可以达到动态创建的目的了 解决方案: 假设我们

WebService的创建和部署以及通过反射动态调用WebService

一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称点击添加 这样我们的基础的WebService就创建好了 接下来我们填加一个webservice的测试方法,并且打上特性标签WebMethod,只有打上特性标签WebMethod并且访问修饰符设置为public后外部才能调用到该方法 using System; using System.Collections.Ge