RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 794122
Accepted
Arasfon
Arasfon
Asked:2020-03-06 03:17:35 +0000 UTC2020-03-06 03:17:35 +0000 UTC 2020-03-06 03:17:35 +0000 UTC

解析dll并将它们添加到程序中

  • 772

有一个程序应该执行一个非常复杂的功能(请帮助实现它):

有一个dll。它包含一个具有以下结构的文本文件:

{
    MainWindow="MainWindow.xaml"
    Code="MainWindow.xaml.cs"
    Pattern=WPFStandart
}

我可以解析它,但是我需要以某种方式使用该dll中描述的逻辑的窗口,并且该dll必须在项目文件夹中,该dll的名称总是不同(我知道如何识别它),而您无法通过 Visual Studio 添加依赖项,因为名称和内容总是不同(开发人员不同,或者他们的团队不同)。

所有信息最初都存储在 pkginfo.txt 文件中的 dll 中,该文件位于项目的根目录(在组装期间编译为嵌入式资源),希望在没有本地复制的情况下打开窗口(“解压缩 dll” )。

更新 我找到了一种方法

[DllImport("name.dll")]
public static extern void VoidInDll();

但我有用户设置的打开的 DLL 的名称,并且DllImport只接受常量。期待选项...

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-03-08T19:46:29Z2020-03-08T19:46:29Z

    基本上,这个问题有两个部分:如何使用程序集资源,以及如何动态使用类型。System.Reflection.Assembly为了解决这些问题,使用和 类System.Activator。下面的简化示例演示了这一点。

    让我们创建一个类库测试项目,其中包含一个标记为嵌入式资源ResTestDLL的文本文件和一个类:file.txt

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace ResTestDLL
    {
        public class Cat
        {
            public override string ToString()
            {
                return "I am cat";
            }
        }
    }
    

    让我们创建一个应用程序:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Text;
    
    namespace ResTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                /**** Демонстрация загрузки ресурса *****/
    
                //путь к DLL
                string path = Path.Combine(Environment.CurrentDirectory, "ResTestDLL.dll");
    
                //имя ресурса: складывается из имени сборки и имени файла
                string resname = "ResTestDLL.file.txt";
    
                Assembly ass = Assembly.LoadFile(path);//загружаем DLL
    
                string[] names = ass.GetManifestResourceNames();//получаем все ресурсы
                if (names.Length == 0)
                {
                    Console.WriteLine("Ошибка: В сборке нет ресурсов");
                    Console.ReadKey();
                    return;
                }
    
                foreach (string name in names)
                {
                    if (name == resname) //находим нужный ресурс
                    {
                        //открываем поток для чтения данных
                        Stream s = ass.GetManifestResourceStream(name);                    
                        StreamReader read = new StreamReader(s);
    
                        using (read)
                        {
                            //выводим содержимое ресурса
                            Console.WriteLine(read.ReadToEnd());
                        }
                        break;
                    }
    
                }
    
                /**** Демонстрация динамической работы с типами *****/
    
                string classname = "Cat"; //имя класса, который мы будем создавать
                string method = "ToString"; //имя вызываемого метода
    
                var types = ass.GetTypes(); //получаем все классы в сборке           
    
                foreach (var type in types)
                {
                    if (type.Name == classname)//находим нужный тип
                    {
                        object o = Activator.CreateInstance(type);//создаем экземпляр
    
                        MethodInfo mi = type.GetMethod(method);
    
                        string res = (string)mi.Invoke( //вызываем метод
                            o, //ссылка на экземпляр
                            new object[0] //массив аргументов
                            );
    
                        Console.WriteLine("Результат вызова метода: " + res);
                        break;
                    }
                }
    
                Console.ReadKey();            
    
            }
        }
    }
    

    让我们编译它并将其DLL放在与EXE. 应用程序必须输出文件中的文本file.txt和方法调用的结果。

    笔记。如果资源不是作为项目元素添加的,而是通过项目属性中的“资源”选项卡添加的,那么一切都会变得更加复杂:您将不得不使用ResourceReader类并从dictionary.

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5