Вопрос по loading, c#, class, namespaces, text-files – C # - загрузить текстовый файл как класс

5

Есть ли способ загрузить файл .txt как класс, из которого моя основная программа может затем вызывать функции? Я в основном пытаюсь добавить поддержку модов в мое простое приложение, где пользователь может выбирать опции из каждого файла. Файл имеет похожий (но не тот же) формат, с кучей пустот (функций), которые вызываются в основной программе.

Как я могу это сделать? Возможно ли это сделать (возможно, нет, отвечая на мой собственный вопрос?), Учитывая, что он не будет компилироваться вместе с остальной частью программы?

Спасибо!

Вероятно, придется изучить использование Roslyn Prescott
Это возможно, но вы должны вызывать компилятор C # ... нетривиально. Проще потребовать, чтобы ваши моды были скомпилированы в dll, которые вы затем можете загружать и вызывать с отражением. Blorgbeard

Ваш Ответ

3   ответа
6

Скомпилировать массив C # во время выполнения и использовать его в коде?

По сути, вы хотите вставить ваш текстовый файл в CodeDom и скомпилировать его. После этого, вероятно, будет полезно создать несколько динамических методов в качестве помощников выполнения.

Receive uploaded file Perform any needed validation on the file Read the file as a string into the CodeDom Deal with any compiler/structure errors Create helper methods using Linq expression trees or dynamic methods so that the linkage between the new class and existing code is bridged with a compiled object (otherwise, all the new methods would need to be invoked using reflection)
var csc = new CSharpCodeProvider( new Dictionary<string, string>() { { "CompilerVersion", "v4.0" } } );
var cp = new CompilerParameters() {
    GenerateExecutable = false,
    OutputAssembly = outputAssemblyName,
    GenerateInMemory = true
};

cp.ReferencedAssemblies.Add( "mscorlib.dll" );
cp.ReferencedAssemblies.Add( "System.dll" );

StringBuilder sb = new StringBuilder();

// The string can contain any valid c# code

sb.Append( "namespace Foo{" );
sb.Append( "using System;" );
sb.Append( "public static class MyClass{");
sb.Append( "}}" );

// "results" will usually contain very detailed error messages
var results = csc.CompileAssemblyFromSource( cp, sb.ToString() );

Также смотрите эту тему:Реализация скриптового языка в C #. IronPython с DLR может подойти для ваших нужд.

Понимаю. К вашему сведению, скрипты тоже скомпилированы, просто на лету. В зависимости от ваших требований к производительности динамическая компиляция может быть подходящей, хотя компиляция c #, вероятно, менее оптимизирована для операций на лету.
Это выглядит действительно здорово, я добавлю это! Спасибо! Scott
В этом-то и дело - я не обязательно хочу его скомпилировать, мне просто нужно, чтобы он работал как скрипт. Scott
3

ompiler-as-a-service (либоПредварительный выпуск Microsoft проекта Roslyn или жеMono.CSharp). Затем вы можете взять скомпилированные результаты и запустить их в вашей программе.

Если вообще возможно, чтобы ваш пользователь вручил вам скомпилированную сборку вместо некомпилированного исходного файла, вам следует рассмотретьСтруктура управляемой расширяемости или жеMono.Addins.

Второй подход (сборки расширений) кажется мне лучше по крайней мере по двум причинам: 1) ваш пользователь может использовать любую среду разработки, которую он хочет, чтобы убедиться, что его код компилируется правильно, прежде чем передать его вам, и 2) у вас меньше работа для проверки ввода и обработки сбоев.

Не стоит недооценивать Mono.CSharp - это «готовый продукт». чей интерфейс вы можете ожидать, чтобы не изменить. Интерфейс Roslyn, вполне вероятно, изменится между текущим состоянием CTP и его окончательным RTM. Как только он приблизится к поставке, Roslyn может быть более подходящим выбором для типичного проекта .NET, но помните, что сборки Mono работают на CLR от Microsoft так же, как и любые другие сборки.
Спасибо! Я проверю Рослин, есть несколько комментариев, говорящих об этом. Scott
1

Use a Framework that Handles Plugins

Среда Managed Extensibility - это то, что вы ищете

http://mef.codeplex.com/

The Managed Extensibility Framework (MEF) is a composition layer for .NET that improves the flexibility, maintainability and testability of large applications. MEF can be used for third-party plugin extensibility, or it can bring the benefits of a loosely-coupled plugin-like architecture to regular applications.

MEF предоставляет четко определенную архитектуру для поддержки плагинов в вашем приложении.

DLL vs. Text (Source Code)

Ожидается, что разработчик плагина предоставит DLL, содержащую код плагина. Однако при необходимости вы можете скомпилировать исходный код в DLL для них, используяРослин, Имейте в виду, что если вы хотите поддержать получение исходного кода плагина, вам также необходимо будет предоставить поддержку, чтобы помочь пользователю справиться с ошибками компилятора и отладить плагин в вашей среде. Может быть, разумнее потребовать от них предоставления DLL.

Есть какие-нибудь обновления по этому поводу?
@Prescott: обновил мой ответ, чтобы решить эту проблему.
Будет ли это работать с TXT-файлом в качестве класса? Я бы подумал, что ему нужно скомпилировать его

Похожие вопросы