J'essaie de créer un assembly dynamiquement dans .Net. Cependant, je n'arrive pas à comprendre comment obtenir la propriété CodeBase pour renvoyer une valeur. Voici un exemple:Impossible d'accéder à CodeBase à partir d'un assembly généré dynamiquement
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()
Quelqu'un peut-il voir ce que je fais mal?
Explication: J'essaie d'étendre NUnit avec un addin qui génère des méthodes de test lors de l'exécution. Il le fait en prenant un tableau de délégués d'action. Malheureusement, Reflection est cuit assez profondément dans le cadre, j'ai donc dû émettre des classes avec une méthode pour chaque délégué d'action. Cela fonctionne correctement lorsque j'utilise les classes NUnitTestMethod uniquement, mais lorsque j'utilise NUnitTestFixture, il échoue car il essaie de lire la base de code à partir de l'assembly. Je ne voulais pas créer un assemblage physique, mais ce projet a été un compromis après l'autre.
J'avais peur de cela. Je pourrais devoir faire ceci pour être fait, alors creuser plus profondément dans NUnit pour essayer de limiter les dommages que leur dépendance forte à la réflexion provoque. –