首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从动态生成的程序集访问CodeBase

无法从动态生成的程序集访问CodeBase
EN

Stack Overflow用户
提问于 2010-04-11 04:46:41
回答 2查看 2.6K关注 0票数 4

我正在尝试在.Net中动态创建一个程序集。但是,我似乎不知道如何让CodeBase属性返回值。下面是一个例子:

代码语言:javascript
复制
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委托来实现这一点。不幸的是,反射已经深入到框架中了,所以我必须使用每个Action委托的方法来发出类。当我只使用NUnitTestMethod类时,它工作得很好,但是当我使用NUnitTestFixture时,它失败了,因为它试图从程序集中读取CodeBase。我不想创建一个物理程序集,但这个项目已经是一个接一个的妥协。

EN

回答 2

Stack Overflow用户

发布于 2010-04-11 05:11:57

我认为异常的原因是CodeBase在动态程序集上没有意义。来自MSDN:

最初指定的程序集的位置

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

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-04-11 09:56:27

程序集的Location是否有效?您可以派生NUnit并使用它,而不是给定您的参考损坏:P

我花了几个小时听NUnit的“可扩展性”的故事,我无法想象会选择它而不是xUnit.net --但我猜最终的决定者将是你有多少测试……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2614914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档