Компиляция во время выполнения 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. Это дополнение.

Другие вопросы по тегам