2

Я компилирую DLL во время выполнения с использованием CSharpCodeProvider. Мой код работает отлично на некоторых машинах, но на otherse он не со следующей ошибкой:Сборник компиляции CSharpProvider, не получивший DLL

error CS0006: Metadata file 'EntityFramework.dll' could not be found

Вот фрагмент кода:

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); 
} 

Любые мысли о том, почему это может происходить?

+0

У всех машин есть инфраструктура Entity? Если нет, вам может потребоваться установить .Net framework 4 на них или развернуть вручную – Amitd

+0

@Amitd: что является самым простым способом определить, так ли это? К моему знанию, на всех этих машинах установлен .NET 4. Это машины для разработчиков, где наше приложение (которое использует EF разрабатывается ...) – ChaseMedallion

+0

для EF более подробная информация на этой странице .. http://stackoverflow.com/questions/6498388/could-not-locate-assembly-entityframework. Возможно, есть разница в версии .. нет подсказки .. также попробуйте скопировать dlls в выходной папке, как сказал Ганс – Amitd

ответ

3

EntityFramework не является частью платформы .NET. Таким образом, простое объяснение состоит в том, что машина, с которой она не работает, не установлена. Вы должны развернуть его самостоятельно. Когда вы используете пакет Nuget, вы получите копию DLL в каталоге bin \ Release. Не забудьте включить его в свои двоичные файлы.

Следующий режим отказа - это то, что вы сделали. Разверните его, но рабочий каталог программы не там, где вы надеетесь. Предоставьте полное имя пути сборки, чтобы этого избежать. Вы можете использовать, скажем, Assembly.GetEntryAssembly(). Местоположение, чтобы найти путь к EXE.

+1

Рабочий каталог оказался проблемой. Я использовал отражение, чтобы найти путь к EF DLL, используемый текущим приложением, а затем задал путь, используя опцию компилятора «/ lib». – ChaseMedallion

1

Вы упоминаете код работает на некоторых, но не на других, он явно загружает все стандартные System файлы правильно, так как они упорядочиваются прежде, чем EntityFramework.dll, и это понятно, сам код, как правило, все в порядке, потому что эти стандартные библиотеки не врезаться.

Кажется довольно очевидным, что машины, на которых он не работает, не имеют установленной инфраструктуры Entity, что имеет смысл, поскольку оно не является частью родной среды .NET. Это надстройка.

 Смежные вопросы

  • Нет связанных вопросов^_^