问题标签 [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.
.net - 从 CodeBase 加载的 .NET 程序集在哪里?
我正在使用应用程序配置中的 < codebase > 元素从外部位置加载 dll。我想知道程序集在哪里实例化?
我让 <codebase> 指向我的本地驱动器(在 appbase 之外)以及一个网络共享驱动器,并运行 fuslogvw 和进程监视器以查看发生了什么。但我无法说出引擎盖下到底发生了什么。
下面的链接解释了它转到特定于用户的应用程序缓存。 http://msdn.microsoft.com/en-us/magazine/cc164080.aspx
下面的链接解释了它进入一个特殊的 GAC 缓存。 http://www.developer.am/c-net-platform/?page=understanding-the-codebase-element
总的来说,我理解它,因为它应该被加载到某个缓存位置,但我无法确认。请帮忙。我想知道加载和存储 ddl 的确切位置。
谢谢
c# - 创建现有装配体/模块的动态副本
是否可以创建程序集或模块/类的动态副本?AssemblyBuilder
我可以很容易地找到如何使用/ ModuleBuilder
(如此处所示)从头开始创建动态程序集或模块,但是有没有办法将现有程序集或类型的副本创建为其各自的 Builder 类型?
编辑 1
例如,假设您有一个标准控制台应用程序,其中包含必需的Program
类和Main
方法,并且您将另一个类添加到项目中,称为“A”。我的目标是在使用方法或类似方法中创建A
类的动态副本。Main
ModuleBuilder
编辑 2
我想要复制 class 的原因A
是因为我想要一个完全相同的 class 副本A
,包括方法、字段、属性等,但是是动态创建的。我不想要的是必须使用 TypeBuilder/CodeDom 手动创建类型及其所有成员(方法、字段、属性等),因为在某些情况下,我可能不知道关于一个类及其内部工作或类可能很大且繁琐/无法使用此方法重现。
希望一些伪代码可以说明我在寻找什么:
我基本上只是想将 an 装箱Assembly
为 anAssemblyBuilder
或Type
as TypeBuilder
。我也不需要能够保存程序集。
c# - 尝试使用接口解决 Assembly.Load 的编译时错误
我在运行时在我的代码上加载了一个程序集,并且在运行时对该程序集的所有引用都被破坏了,正如我在这个线程中提到的那样:
但是现在我尝试使用此线程中的绅士建议的技术来解决此问题:
http://www.codeproject.com/Articles/187788/Dynamically-Loading-NET-Assemblies-using-Interface
这里唯一的问题是我从动态程序集中激活的类使用我无法在我的接口中定义的程序集的本机类型。这就是我卡住的地方。
我还尝试用对象/动态替换那些外国程序集的本机类型,但那时我的转换失败了。
关于如何解决这个问题的任何建议?
c# - 动态模块什么时候可以有类型加载异常?
我有一个动态模块,它会在我的应用程序运行时将类型添加到其中。该模块是通过以下代码创建的:
应用程序的其他部分有时也会在模块的程序集中调用 GetTypes()。有时,当发生这种情况时,我会为动态模块中的一种类型获得 TypeLoadException。堆栈跟踪是:
我的问题是:什么可能导致此异常?运行时模块是真正的线程安全的,还是在创建类型的过程中会出现调用 GetTypes() 的竞争条件?
编辑:这是一小段代码,可以为我可靠地重现该错误。现在看来,如果在 DefineType() 和 CreateType() 之间调用 GetTypes(),就会发生异常:
c# - .Net 4.0 中的动态程序集加载
我的问题始于将 .Net 2.0 应用程序移动到 .Net 4.0。我必须这样做的原因是 Windows 8 默认情况下不启用早期的 .Net 版本,并且我的应用程序无法要求用户启用它。
该应用程序是一个 NPAPI 插件,它通过UnmanagedExports使用 .Net 组件。我将它设计为低完整性应用程序,因此它必须驻留在用户的“LocalLow”目录中。
在我的应用程序中,我使用动态程序集加载机制在运行时加载多个程序集。我使用以下方法加载程序集,
将项目修改为 .Net 4.0 后,我注意到当二进制文件放在 LocalLow 目录中时插件崩溃(它在其他地方工作)。我的下一步是用最少的代码创建一个简约的插件来解决问题。我注意到动态程序集加载失败,出现以下异常,
我尝试了以下方法来创建一个单独的域并加载程序集但没有运气,
- http://blogs.msdn.com/b/shawnfa/archive/2009/06/08/more-implicit-uses-of-cas-policy-loadfromremotesources.aspx
- http://www.west-wind.com/weblog/posts/2009/Jan/19/Assembly-Loading-across-AppDomains
添加配置“loadFromRemoteSources”也不起作用。.Net 组件似乎没有加载 .dll.config 文件。(可能是因为 UnmanagedExporting)
我的问题是,
- 是否可以从 LocalLow 动态加载程序集?
- CLR 4.0 中的新 CAS 策略是否也适用于 LocalLow?据我所知,它应该只影响通过网络加载的程序集
- 有没有其他方法可以克服这个问题?
c# - 使用 compiletoMethod() 表达式树静态链接和编译运行时
我正在开展一个项目,我们正在使用 DLR 将 Racket 语言移植到 .NET。
我们建立一个表达式树并调用CompileToMethod()
方法:
相关的可执行发射代码:(取自How to Save an Expression Tree as the Main Entry Point to a New Executable Disk File?)
我们有我们的运行时库Runtime_rkt.dll
,其中包含相关的运行时类型转换、支持对象等。
当我们放置在同一个目录中时,一切正常Foo.exe
。Runtime_rkt.dll
我们遇到的问题是当我们(显然)将运行时库移动到其他地方时。最终,我们将希望C:\Windows\Microsoft.NET\assembly\GAC_MSIL
像 IronPython 一样安装它。[使用 GAC 解决]
[编辑] 额外点的新问题 有什么方法可以将所有运行时方法静态编译到可执行文件中?
c# - 使用带有 ModuleBuilder 而不是 MemoryStream 的 Roslyn Emit 方法
使用 Roslyn 编译为动态程序集时,我遇到了性能问题。编译大约需要 3 秒,而使用CodeDom
编译器编译相同代码需要大约 300 毫秒。这是我用来进行编译的代码的精简版本:
这个答案建议将 ModuleBuilder 对象传递给 Emit 方法而不是 MemoryStream 以加快速度。我试图遵循这种模式,如下所示:
但是我的 Roslyn 版本显然没有Emit
采用ModuleBuilder
. 那个版本是:
ID: Microsoft.CodeAnalysis
版本: 0.6.4033103-beta(预发布)
项目信息:http: //msdn.microsoft.com/en-US/roslyn
显然,这是一个预发布版本,所以 api 可能已经改变并不奇怪。然而,
我的问题
- 有谁知道为什么该
Emit
方法似乎不再具有需要 a 的重载ModuleBuilder
? - 是否有另一种方法可以在仍然使用 Roslyn 的同时加快编译速度(Roslyn 提供了一些
CodeDom
我不想放弃的和 Mono 编译器的优势)?
c# - 如何使用表达式而不是发出 IL 来生成此属性实现?
我试图在运行时生成实现属性获取器的类,其主体调用生成类的基类上的方法。这是一个简单接口的示例,以及我试图复制的手写实现和基类。
我有一个生成器的工作实现,它发出 IL 来构建方法,但如果我可以使用表达式来实现,我认为这将更容易扩展和维护。我将需要在属性定义上查找自定义属性,并使用它来调用属性实现中基类的不同方法重载。
这是我为属性 get 实现构建表达式的地方。我真正不明白的是构建 Call 表达式,如果我正确设置它来做相当于this.Get()
or base.Get()
。现在它抛出System.ArgumentException : Invalid argument value Parameter name: method
一个CompileToMethod
我真的不知道从这里去哪里。我已经尝试了 Expression.Call 的其他一些参数变体,但其他所有参数都有 Call 抛出异常,因为参数是错误的类型。
这是我正在使用的所有示例代码的可构建版本,包括工作的 IL 发射器:
c# - 使用 Reflection.Emit 创建的动态程序集崩溃,退出代码为 -532462766
我一直在关注这篇文章来生成一个动态程序集,如下所示:
以下是我对上面代码的了解:
- 它正在创建一个动态程序集,仅保存。
- 程序集名称、模块名称和输出 PE 名称都是不同的(我假设这不是问题)。
- 它创建了一个名为 Program 的公共静态类。
- 它在这个类中创建一个带有签名的方法
private static int Main (string [])
。 - 它将此方法设置为入口点并将程序集配置为控制台应用程序。
- 它将程序集编写为与处理器架构无关的 ILOnly。
- 它将程序集映像配置为我正在运行的 i386(带有 Intel 处理器的 Win7 32 位)。
方法:
- 将字符串文字引用推送到堆栈。
Console.WriteLine
使用从堆栈中获取的参数进行调用。Console.WriteLine
使用 再次调用EmitWriteLine
。- 将 0 作为 Int32 推入堆栈作为返回值。
- 返回。
碰撞:
忽略图像上的文件名。这将MyDynamicAssembly.exe
按照上面的代码。
任何关于这里出了什么问题的指针将不胜感激。
c# - Fluent NHibernate 无法为动态程序集自动创建映射
我正在开发一个遗留代码库,它可以即时构建它的一些实体。我希望能够使用AddEntityAssembly
这样的方法将这些实体添加到我的自动持久模型中:
当我尝试使用此模型构建配置时,我得到了一个让我感到FileNotFoundException
困惑的问题,因为程序集已经加载到AppDomain.CurrentDomain
并且我可以构建一个RunTimeEntityType
使用的新对象Activator.CreateInstance
我需要做一些额外的事情吗?