Domanda

Usando .NET 2.0.

System.Drawing è nel mio elenco dei riferimenti.

Ecco la mia istruzione using:

using System.Drawing;
.

Ecco il codice:

private static Rectangle rScreen;
.

Ecco l'errore su questa riga:

.

Testo dell'errore: il tipo o il nome dello spazio dei nomi "Rettangle" non esiste nel "System.Drawing" del Namespace (ti manca un riferimento di assemblaggio?)

Perché?

Modifica: Aggiunto codice compilation:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("CompilerVersion", "v3.5");

CSharpCodeProvider codeProvider = new CSharpCodeProvider(dict);

CompilerParameters parameters = new CompilerParameters();

{
    parameters.ReferencedAssemblies.Add("System.Drawing.dll");

    parameters.ReferencedAssemblies.Add("System.dll");

    parameters.ReferencedAssemblies.Add("System.Core.dll");

    parameters.ReferencedAssemblies.Add("System.Data.dll");

    parameters.ReferencedAssemblies.Add("System.Data.Linq.dll");

    parameters.ReferencedAssemblies.Add("System.DirectoryServices.dll");

    parameters.ReferencedAssemblies.Add("System.Configuration.dll");

    parameters.ReferencedAssemblies.Add("System.Web.dll");

    parameters.ReferencedAssemblies.Add("System.Xml.dll");

    parameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

    parameters.ReferencedAssemblies.Add("System.Web.Services.dll");

    parameters.ReferencedAssemblies.Add("System.ServiceModel.dll");

    parameters.ReferencedAssemblies.Add("System.IdentityModel.dll");

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.Common.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));

    parameters.ReferencedAssemblies.Add(string.Format(@"{0}{1}Microsoft.ReportViewer.WebForms.dll", AppDomain.CurrentDomain.RelativeSearchPath, @"\ReportViewer\"));
}

CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, sources.ToArray());

try
{
    ApexAssemblyManager.dynamicAssemblies.Add(hashKey, new DynamicAssemlby(results.CompiledAssembly));

    return ApexAssemblyManager.dynamicAssemblies[hashKey].CreateInstance(typeName);
}
.

Tutti gli altri referenziassEmbliemi funzionano e hanno lavorato per molto tempo.Questa è la prima volta che ho avuto un tale errore.

Ho assicurato e ricontrollato il riferimento che viene aggiunto il riferimento.Se provo ad aggiungerlo al progetto, ricevo un messaggio che il riferimento già esiste.

Grazie

È stato utile?

Soluzione

Si dichiara nei commenti e dei tag che questo viene compilato dinamicamente da un'altra applicazione. È quindi probabile che questa altra applicazione non includa System.Drawing.dll come riferimento quando si esegue la compilazione e quindi, il tipo è irrisolto. Non è sufficiente semplicemente allo stato using System.Drawing, il montaggio che definisce che anche lo spazio dei nomi e i suoi tipi devono essere passati al compilatore.

In codice, questo viene fatto usando un CompilerParameters istanza passata tramite una delle chiamate CompileAssemblyFrom... in CodeDomProvider istanza che esegue la compilazione (in questo caso, CSharpCodeProvider ). CompilerParameters.ReferencedAssemblies La raccolta indica al compilatore Quali assembly da guardare quando si tenta di eseguire la risoluzione del tipo.

Aggiornamento
Prova ad aggiungere esplicitamente mscorlib ai riferimenti.

Inoltre, non so se questo è correlato, ma come hai menzionato un server (è un servizio di qualche tipo?), MSDN afferma :

.

lezioni all'interno del sistema.drawing Lo spazio dei nomi non è supportato per l'uso all'interno di un servizio Windows o ASP.NET. Tentativo di utilizzare queste classi da In uno di questi tipi di applicazione può produrre problemi imprevisti, tali come prestazioni del servizio diminuite e Eccezioni di runtime. Per un supporto Alternativa, vedere Windows Imaging Componenti.

Direi che questo si qualifica come un problema imprevisto anche se non mi aspetterei problemi di manifestarsi durante un processo di compilazione, ma piuttosto quando si esegue il codice. Detto questo, non specificano davvero che nella documentazione, quindi potesse applicarsi all'uso di System.Drawing.dll come riferimento in generale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top