问题标签 [dynamic-assemblies]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 这个类是否保持创建?
我正在动态加载程序集,创建实现的类的实例IRegisterable
,然后使用以下缩短的代码调用注册方法:
还有一个IRegisterable
类的例子:
当类注册时,它会调用 中的一个方法,RegistrationHandler
然后调用该方法中的一个方法,该方法JobScheduler
将创建一个Threading.Timer
在注册TimerCallback
中actionMeathod
传递的对象。除此之外,没有其他对该IRegisterable
类的引用。
我的问题是,类是否保留在内存中,因为有对该方法的引用,还是每次调用该方法时都会重新创建该类?还是两者兼而有之?
我问的原因是Class1.Register
创建一个实例Class3
并Class3.TestJob3
作为actionMeathod
. 创建Class3
时,它会设置t=5
,用于TestJob3
. 但是当Register
方法退出时,实例Class3
被销毁,因为它是一个局部变量。但是定时调用Class3.TestJob3
仍然有t=5
,所以Class3
每次都重新创建还是持续存在?
c# - 每次或仅加载一次程序集
我正在为我的工作构建一个可扩展的服务应用程序,它“扩展”的方式是加载 DLL 并在其中执行方法。它是这样设计的,所以每次我们有新工作要做时,我都不需要重新编译和重新部署。目前,该服务使用加载一个 DLL Assembly.LoadFrom()
,然后向该服务注册程序集。在注册中,Func<object, bool>
传递了一个指示新作业的入口点的参数。
我的问题是,如果我每次需要通过类似的方式运行任务时都创建实例会更好:
还是按照我目前的方式来做会更好,我将它存储Func<>
在一个基于计时器调用的类中?
c# - 如何试驾构建动态装配
我正在为 IBM Db2 数据库的 LINQPad 构建动态上下文驱动程序。我一直在测试驱动大部分代码,我想我已经完成了我需要的关于我需要的数据库的所有信息。(我以后可能需要更多,但现在似乎足够了)。我下载了 PostgreSQL 上下文驱动程序的 git 存储库,并查看(某种程度上)它是如何构建的。没有足够的测试让我对自己正在构建程序集充满信心。但是后来我开始考虑是否要开始构建这个动态程序集,我不知道如何测试它。我想从这样简单的开始:
那么这是正确的方法吗?我会这样做吗?
c# - C#动态程序集无法创建新对象并加载到字段
我正在尝试为给定类型创建新对象并将其加载到字段中,但它会抛出一个
无效程序异常。
使用当地人做同样的事情。也许在字段上做错了什么?这不起作用:
但这有效:
那么有什么区别,为什么首先不工作?谢谢。
c# - 使用动态程序集加载从库项目开始的外部程序的 Visual Studio 控制台输出
我创建了一个由 3 个项目组成的简单测试解决方案:
- 第一个项目是一个类库,其中包含一个接口 ITest 和一个方法 void DoSomething()
- 第二个项目也是一个类库,其中包含一个实现 ITest 的 Test 类,在 DoSomething 中,它只是做了一个 Console.WriteLine
- 第三个项目是一个 Forms 应用程序,它使用动态程序集加载通过 ITest 接口加载和实例化 Test 类。
这是源代码:
在带有 Test 类的 LibraryProject 中,我引用了表单应用程序项目,并且在 Debug 下的项目属性中,我选择了“启动外部程序”以从库调试文件夹中启动表单应用程序:
正如预期的那样,我现在可以运行库项目。这会将表单应用程序作为输出文件夹中的外部程序启动。在那里,表单找到库 dll 并动态加载它并在我的 Test 类上执行 DoSomething 方法。
但是,这是我的问题/我的问题,我在 Visual Studio 中没有得到任何控制台输出。当我运行库项目时,我可以完美地调试表单应用程序,但控制台输出永远不会出现。当我使用控制台应用程序而不是表单应用程序时,会打开一个外部 cmd,我可以在那里看到输出,但我需要输出也可以与表单一起使用,并且它必须在 Visual Studios 输出窗口中。
你知道我怎么看不到输出吗?我想出获得输出的一种方法是使用 Trace.WriteLine 而不是 Console.WriteLine 但我不明白为什么跟踪工作而控制台不工作。任何帮助表示赞赏。
c# - 如何卸载和重新加载运行时生成的程序集?
我正在开发一个实用程序,它允许您在运行时编译一段代码。我想将该代码放在一个临时程序集中并加载它。
稍后,在用户对代码进行更改后,我想使用更改创建一个新的临时程序集。但是,似乎旧版本仍然存在并混淆了我的其余代码。如何卸载原始临时程序集?
c# - 在这段代码中动态生成的程序集在哪里?
我用于生成 Excel 电子表格的混合 Excel Interop/EPPlus 应用程序在每次执行时运行速度逐渐变慢。
为了找出原因,我下载了 ANTS Memory Profiler 并运行了该应用程序。
ANTS MP 在其“加载到 CLR 中的程序集”详细信息中告诉我有 2 个动态生成的程序集。一个是在“InitializeExcelObjects()”方法中,这是有道理的,因为它创建了一个 Excel.Application 和相关对象。但是(据说?)加载程序集的第二种方法是:
...牵连的是这个:
...它没有做任何不寻常的事情(范围在代码中的所有位置都分配了,那么为什么这个被认为与其他不同并且是程序集的产生者)?
是因为这是第一次分配范围吗?完成后是否会动态加载某些程序集(仅一次)?
这是调用相关方法的代码:
这是意料之中的(因为此时程序集是动态加载的),或者这可能与正在经历的逐渐恶化的性能有关?
更新
根据 Glenn Ferrie 的评论,这种方法可能很有趣:
c# - 使用引用的程序集在运行时编译
我创建了一个函数来编译内存中的字符串中的 C# 代码并在运行时使用它。它工作得很好。
接下来,我创建了一个小型类库(我们称之为 mynew.dll)并将其放在 c:\mylibraries\mynew.dll 中。
在我的代码中,我可以添加一个引用的程序集。我这样做:
现在,在我的 C# 代码字符串 (mycode) 中有一个名为“Execute”的函数。当我在此函数中从 mynew.dll 声明名称空间和类时,我收到此错误:
无法加载文件或程序集“MyNew,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。
当我复制主应用程序的 bin/debug 文件夹中的 dll 时,它突然起作用了,但我不想要这个。我希望在运行时编译的代码使用它,而不是主应用程序。
这是我在这里发布之前所做的:
- 搜索 Stackoverflow
- 使用谷歌
- 试图将 dll 编译到磁盘而不是内存中。这行得通...现在的问题是 dll 被锁定在 IIS 中,如果不重新启动 IIS 服务器就无法删除它;没有选择,因为代码可以随时更改,当人们在网站上时我不想重新启动服务器。
有没有办法来解决这个问题?
c# - 在运行时在 C# 中创建动态类型
我正在尝试在运行时动态创建 ac# 类。
但我无法具体做到这一点。
min
我只需要类的任何ormax
属性的 get 方法ProcessData
。
我的上述任务代码:
c# - 如何在使用 IL Emit 动态生成的类中使用本地对象
我什至不确定这是否可能。在一个方法中,我正在创建一个动态程序集,定义一个类型,并为该类型的构造函数发出 IL。此方法将 aIEnumerable<Action>
作为参数,我希望能够在我生成的类中使用该引用。
我已经编写了一些数据库迁移助手来使用 FluentMigrator 或 MigratorDotNet,并且我正在尝试实施单元测试来验证正确的功能。使用 FluentMigrator,我可以实例化一个跑步者并将其传递给 Migration 类的实例。然而,对于 MigratorDotNet,它需要我向它传递一个程序集,它会扫描 Migration 类以实例化和运行 - 因此是动态生成。
这是我动态子类化的基类:
这是我生成动态实现的代码:
我打开了一个项目并创建了一些示例子类来检查:
或者:
这是他们生成的 IL:
或者:
我不确定如何使它适应我想要实现的目标。我可以在 IL 加载指令中对存在于动态程序集上下文之外的这个本地对象进行引用吗?表达式可以帮助吗?也许尝试在构造函数中传递它是错误的方法 - 也许是覆盖 up 和 down 实现(我可以像一个 Action 的函数句柄并发出对它的调用,而不是传递对它的引用吗? IEnumerable?)。
我对汇编和 IL 非常熟悉,在回顾了操作之后,我开始认为我可能无法做我想做的事情。
那么,这是否可能,如果可以,有人可以将我推向正确的方向吗?
对于好奇的人,完整的代码在这里。