Компиляция во время выполнения CSharpProvider не может найти DLL
Я компилирую DLL во время выполнения, используя CSharpCodeProvider. Мой код работает нормально на некоторых машинах, но на другом он завершается со следующей ошибкой:
ошибка CS0006: файл метаданных 'EntityFramework.dll' не найден
Вот фрагмент кода:
var csFile = ... // the file is in C:\Program Data\MyFolder\InnerFolder
using (var provider = new CSharpCodeProvider())
{
var parameters = new CompilerParameters
{
GenerateInMemory = false, // we want the dll saved to disk
GenerateExecutable = false,
CompilerOptions = "/target:library",
// the assembly is compiled to the same directory as the .cs file
OutputAssembly = GetNewCacheAssemblyPath(),
};
parameters.ReferencedAssemblies.AddRange(new[]
{
"System.dll",
"System.Data.dll",
"System.Data.Entity.dll",
"EntityFramework.dll",
});
var compilerResult = provider.CompileAssemblyFromFile(parameters, csFile);
}
Есть мысли о том, почему это может происходить?
2 ответа
EntityFramework не является частью.NET Framework. Таким образом, простое объяснение состоит в том, что на машине, на которой происходит сбой, она не установлена. Вы должны развернуть это самостоятельно. Когда вы используете пакет Nuget, у вас будет копия DLL в каталоге bin\Release. Не забудьте включить его в ваши двоичные файлы.
Следующий сбойный режим - вы развернули его, но рабочий каталог программы не там, где вы надеетесь. Укажите полный путь к сборке, чтобы избежать этого. Вы можете использовать, скажем, Assembly.GetEntryAssembly().Location, чтобы найти путь к EXE.
Вы упоминаете, что код работает на некоторых, но не на других, он явно загружает все стандартные System
файлы правильно, так как они упорядочены перед EntityFramework.dll
и ясно, что сам ваш код, как правило, в порядке, потому что эти стандартные библиотеки не выходят из строя.
Кажется, совершенно очевидно, что на машинах, на которых происходит сбой, не установлена платформа Entity - что имеет смысл, поскольку она не является частью собственной платформы.NET. Это дополнение.