Компиляция среды выполнения 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);
}

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


person ChaseMedallion    schedule 05.11.2012    source источник
comment
на всех машинах установлена ​​Entity framework? Если нет, вам может потребоваться установить на них .Net framework 4 или развернуть его вручную.   -  person Amitd    schedule 05.11.2012
comment
@Amitd: как проще всего определить, так ли это? Насколько мне известно, на всех этих машинах установлена ​​.NET 4. Это машины разработчиков, на которых разрабатывается наше приложение (которое использует EF...)   -  person ChaseMedallion    schedule 05.11.2012
comment
для получения дополнительной информации об EF на этой странице. вопросов/6498388/ .. может быть разница в версии .. не знаю .. также попробуйте скопировать dll в выходную папку, как сказал Ганс   -  person Amitd    schedule 05.11.2012


Ответы (2)


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

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

person Hans Passant    schedule 05.11.2012
comment
Рабочий каталог оказался проблемой. Я использовал отражение, чтобы найти путь к EF DLL, используемому текущим приложением, а затем указал путь с помощью параметра компилятора /lib. - person ChaseMedallion; 18.11.2012

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

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

person tmesser    schedule 05.11.2012