アセンブリを生成していますか?生成されたが見つからないことを除いて、同じ問題があります.dll
。最初はフォルダに書き込めなかったのではないかと思ったので、今度はCreateDirectory
テキストファイルを呼び出してドロップし、フォルダが書き込み可能であることを示します。
とにかく、同じ問題、成功しません。他の誰もこの問題を抱えていないのは本当ですか?
サーバーをリモートデバッグして、MicrosoftのPDBをステップスルーできるかどうかを確認します...
- 編集 -
Microsoftのコードをステップスルーする必要はありません。私はCompilerResultsのErrorsコレクションを調べましたが、そこに1つの項目がありました:「メタデータファイル'c:\ Windows \ System32\aaclient.dll'を開くことができませんでした-'でプログラムをロードしようとしました不正な形式。'"
Directory.GetCurrentDirectory()を取得して他のDLLを取得すると、WindowsSystem32ディレクトリが使用されます...
- 編集 -
実行中のアセンブリのフォルダから参照を追加することで、これを解決しました。
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());
堅牢性を高めるために、有効なマネージコードアセンブリであるバイナリのチェックを追加する必要があります。このコードは、2つのGetFiles呼び出しの間にLinq.Unionを使用して短縮することもできます。
書き込むのに適したフォルダを見つけるには:
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;
}
}