Domanda

sto cercando di compilare il codice per la memoria in fase di esecuzione utilizzando un CodeDomProvider.

Il codice che sto compilazione di avere un riferimento a un assembly esterno che includo nei parametri utilizzati durante la compilazione del codice.

Quando compilo alla memoria e tenta di utilizzare la riflessione sul assembly generato in Visual Studio Add-In esso genera un'eccezione dicendo che non riesce a trovare il fatto riferimento assemblaggio.

(Exception)
"Impossibile caricare uno o più dei tipi richiesti. Recuperare la proprietà LoaderExceptions per ulteriori informazioni."

(LoaderException)
"{" Impossibile caricare il file o l'assembly 'Dynamo.Jiss.Task, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' o una delle sue dipendenze. Il sistema non riesce a trovare il file specificato. ":" Dynamo.Jiss.Task, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null "}"

Ho provato riferimento all'Assemblea da luoghi diversi utilizzando il percorso assoluto.

Lo stesso identico codice funziona bene se viene eseguito da un'applicazione console, e funziona anche bene nella aggiuntivo se non compilo alla memoria.
Rimuovere il riferimento al gruppo esterno e il codice che riferimento funziona anche durante la compilazione di memoria, quindi probabilmente come l'eccezione descrive è un problema con il caricamento fatto riferimento assemblaggio.

Do chiunque avere un idea del perché la compilazione di memoria e riferimento a un lavoro di assemblaggio isnt in un componente aggiuntivo?

V'è una certa restrizioni entro il dominio di applicazione è in esecuzione o qualcosa che dovrei essere a conoscenza? (La mia ipotesi migliore attualmente)

Dovrebbe essere in una cartella specifica? si fa riferimento utilizzando un percorso relativo? impostazioni di sicurezza? deve essere firmato? qualche idea?


Quello che sto cercando di realizzare è un modo per mettere i file con un'estensione specifica in un progetto e lasciare che il componente aggiuntivo automaticamente compilarlo e se si implementa un'interfaccia ITask (dal gruppo esterno) si chiamerà un metodo di installazione () che rende possibile per il codice per agganciare negli eventi di Visual Studio ed eseguire compiti / scripts ascoltando i diversi eventi. In questo modo posso facilmente eseguire Modelli di testo se un altro file viene modificato, o Combinare e file Minify su diversi eventi (documento salvato, costruzione, ecc.).

fa qualcosa del genere già esiste (a me alleviare dal dolore)? :)

È stato utile?

Soluzione

This is most likely happening because you're telling CodeDom to generate an in-memory assembly (which is really a lie since it's generating temporarily to disk, loading it, then deleting the file). The point is, the compile directory for the CodeDom assembly is not the same as the one you're using to compile it. That is, if you're running in bin\Debug, the CodeDom assembly is being generated to %temp%.

You could solve this in one of two ways I can think of:

  1. Compile the CodeDom assembly to the same path as your executing assembly.

    myCodeProvider.GenerateInMemory = false; // may not be necessary...haven't tried this in a while
    myCodeProvider.OutputAssembly = string.Format(@"{0}\{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location, "mydll.dll");
    
  2. Handle the AssemblyResolve event and provide the CodeDom assembly the referenced assembly it's requested.

    AppDomain.CurrentDomain.AssemblyResolve += OnCurrentDomainAssemblyResolve
    
    private static Assembly OnCurrentDomainAssemblyResolve(object sender, ResolveEventArgs args)
    {
                    // this is absurdly expensive...don't do this more than once, or load the assembly file in a more efficient way
                    // also, if the code you're using to compile the CodeDom assembly doesn't/hasn't used the referenced assembly yet, this won't work
                    // and you should use Assembly.Load(...)
                    foreach (Assembly @assembly in AppDomain.CurrentDomain.GetAssemblies())
                    {
                        if (@assembly.FullName.Equals(args.Name, StringComparison.OrdinalIgnoreCase))
                        {
                            return @assembly;
                        }
                    }
    }
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top