c# - 无法从动态生成的程序集访问 CodeBase

标签 c# .net reflection reflection.emit

我正在尝试在 .Net 中动态创建程序集。但是,我似乎无法弄清楚如何让 CodeBase 属性返回一个值。这是一个例子:

var assemblyName = new AssemblyName
                        {
                            Name = "Whatever",
                            CodeBase = Directory.GetCurrentDirectory()
                        };
var assemblyBuilder = AppDomain.CurrentDomain
    .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("WhateverModule", "Whatever.dll");
var typeBuilder = moduleBuilder.DefineType("WhateverType", TypeAttributes.Public);
var type = typeBuilder.CreateType();
assemblyBuilder.Save("Whatever.dll");
var codeBase = type.Assembly.CodeBase; // throws the below exception

System.NotSupportedException was unhandled
  Message=The invoked member is not supported in a dynamic assembly.
  Source=mscorlib
  StackTrace:
       at System.Reflection.Emit.InternalAssemblyBuilder.get_CodeBase()
       at Stupid.Program.Main(String[] args) in C:\Users\Walking Disaster\Documents\Visual Studio 10\Projects\Lingual.Proxy\Stupid\Program.cs:line 25
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()

谁能看出我做错了什么?

说明:我正在尝试使用一个在运行时生成测试方法的插件来扩展 NUnit。它通过获取一组 Action 委托(delegate)来实现。不幸的是,反射非常深入地嵌入到框架中,所以我不得不为每个 Action 委托(delegate)发出带有方法的类。当我只使用 NUnitTestMethod 类时,这很好用,但是当我使用 NUnitTestFixture 时,它​​失败了,因为它试图从程序集中读取 CodeBase。我不想创建一个物理组件,但这个项目是一个接一个的妥协。

最佳答案

我认为异常的原因是CodeBase对动态汇编没有意义。来自 MSDN:

The location of the assembly as specified originally

如果您重新加载程序集,它不会抛出异常:

var assemblyName = new AssemblyName
                       {
                           Name = "Whatever",
                           CodeBase = Directory.GetCurrentDirectory()
                       };
var assemblyBuilder = AppDomain.CurrentDomain
    .DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule(
    "WhateverModule", "Whatever.dll");
var typeBuilder = 
                 moduleBuilder.DefineType("WhateverType", TypeAttributes.Public);
var type = typeBuilder.CreateType();
assemblyBuilder.Save("Whatever.dll");

var assembly = Assembly.LoadFrom("Whatever.dll");
var codeBase = assembly.CodeBase; // this won't throw exception

关于c# - 无法从动态生成的程序集访问 CodeBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614914/

相关文章:

c# - 加权排列算法

c# - 屏幕抓取 : unable to authenticate into a site utilizing ASP . NET Forms 身份验证

c# - 根据类型参数在泛型方法中调用不同的方法

c# - 使用别名获取列名

c# - 报告查看器 : How to load report as an embeddedresource in another assembly using reflection?

c# - AsQueryable() 在 ASP.NET 中是如何实现的

.net - 在 MonoTouch 上即时转换 MPEG 文件

c# - 登录 .Net 核心控制台应用程序不工作

java - android :onClick use Java reflection concepts behind the scenes?吗

typescript - 有没有办法获取 typescript 对象的所有必需属性