Sind Sie sicher, dass die Baugruppe erzeugt wird? Ich habe das gleiche Problem, außer dass ich die erzeugte .dll
nicht finden kann. Ich habe zuerst vermutet, dass es nicht in den Ordner schreiben konnte, also ruft es jetzt CreateDirectory
auf und löscht eine Textdatei, um zu demonstrieren, dass der Ordner beschreibbar ist.
Wie auch immer, das gleiche Problem, kein Erfolg. Ist es wirklich so, dass niemand anderes dieses Problem hatte?
ich Debug-Remote-werde der Server & sehen, ob ich über Microsofts PDBs ...
Schritt kann - EDIT -
Keine Notwendigkeit, die durch Microsofts Code. Ich habe mir die Errors-Sammlung der CompilerResults angeschaut und dort war 1 Punkt: "Metadaten-Datei 'c: \ Windows \ System32 \ aaclient.dll' konnte nicht geöffnet werden - 'Es wurde versucht, ein Programm mit zu laden ein falsches Format ‚“
Wenn ich Directory.GetCurrentDirectory(), um die anderen DLLs zu holen, es ist das Windows-Verzeichnis System32 usign ...
-. EDIT -
dies gelöst durch Hinzufügen Referenzen aus dem Ordner der ausführenden Baugruppe:
CompilerParameters compilerParameters = new CompilerParameters
{
OutputAssembly = Path.Combine(GeneratedAssembliesFolder, string.Format("{0}.Generated.dll", typeName))
};
string executingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string[] dllFiles = Directory.GetFiles(executingDirectory, "*.dll");
compilerParameters.ReferencedAssemblies.AddRange(dllFiles.Select(f => Path.Combine(executingDirectory, f)).ToArray());
IEnumerable<string> exeFiles =Directory.GetFiles(executingDirectory, "*.exe").Where(f => !f.Contains(".vshost."));
compilerParameters.ReferencedAssemblies.AddRange(exeFiles.Select(f => Path.Combine(executingDirectory, f)).ToArray());
Für eine größere Robustheit sollte man hinzufügen, dass die Binärdateien gültige Assemblys mit verwaltetem Code sind. Dieser Code könnte auch mit einer Linq .Union zwischen den beiden GetFiles-Aufrufe gekürzt werden.
Um einen geeigneten Ordner zu finden zu schreiben:
private static string generatedAssembliesFolder;
private static string GeneratedAssembliesFolder
{
get
{
if (generatedAssembliesFolder == null)
{
string[] candidateFolders = new[]
{
Environment.GetEnvironmentVariable("TEMP", EnvironmentVariableTarget.Process),
Environment.GetEnvironmentVariable("TMP", EnvironmentVariableTarget.Process),
Environment.GetEnvironmentVariable("TEMP", EnvironmentVariableTarget.User),
Environment.GetEnvironmentVariable("TMP", EnvironmentVariableTarget.User),
Environment.GetEnvironmentVariable("TEMP", EnvironmentVariableTarget.Machine),
Environment.GetEnvironmentVariable("TMP", EnvironmentVariableTarget.Machine),
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
};
foreach (string candidateFolder in candidateFolders)
{
try
{
if (!Directory.Exists(candidateFolder)) Directory.CreateDirectory(candidateFolder);
string testFileName = Path.Combine(candidateFolder, Path.GetRandomFileName());
File.WriteAllBytes(testFileName, new byte[0]);
File.Delete(testFileName);
}
catch (Exception ex)
{
continue;
}
generatedAssembliesFolder = candidateFolder;
break;
}
}
return generatedAssembliesFolder;
}
}