Скомпилируйте класс с атрибутами и загрузкой

Не уверен, почему это не работает, в основном это мой код:

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.OutputAssembly = @"C:\myclass.dll";
string code = @"
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;

namespace First
{
    public class B
    {
        public List<string> list = new List<string>();

        [DisplayName(""Pos""),Category(""Test""),DefaultValue(0),DefaultValueAttribute(0)]
        public int Position { get; set; }
    }
}
";
CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, code);
var DLL = Assembly.LoadFile(parameters.OutputAssembly);
foreach (Type type in DLL.GetExportedTypes())
{
    dynamic c = Activator.CreateInstance(type);
    _props.SelectedObject = c;
}

Загрузка класса в сетку свойств работает нормально, но атрибуты игнорируются, есть идеи, почему? и есть ли решение для этого?

1 ответ

Решение

Прежде всего, ваш код даже не компилируется для меня. Требуются некоторые изменения.

  • Вам нужно ссылку System.dll
  • Есть дубликат DefaultValue атрибут в вашем коде, вы должны удалить его

Трудно поверить, что вы собрали сборку с этим кодом. Я обновил код, и он работает как положено.

System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;            
parameters.OutputAssembly = @"C:\myclass.dll";
parameters.ReferencedAssemblies.Add("System.dll");//Add reference

string code = @"
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;

namespace First
{
    public class B
    {
        public List<string> list = new List<string>();

        [DisplayName(""Pos""),Category(""Test""),DefaultValue(0)]
        public int Position { get; set; }
    }
}
";

CompilerResults r = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(parameters, code);
if (r.Errors.Count <= 0)
{
    var DLL = Assembly.LoadFile(parameters.OutputAssembly);
    foreach (Type type in DLL.GetExportedTypes())
    {
        dynamic c = Activator.CreateInstance(type);
        _props.SelectedObject = c;
    }
}
Другие вопросы по тегам