繁体   English   中英

如何在动态创建的dll上设置版本

[英]how to set a version on dynamically created dll

我需要在动态创建的dll上设置版本的帮助。

我正在使用CodeDomProvider创建dll,但无法设置输出程序集的版本。

我在一些博客中看到,只有将编译器参数设置为生成可执行文件而不是内存文件,才能完成此操作。

我的代码是:

using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.Linq;

namespace dynamicDll
{
    class Program
    {
        static void Main(string[] args)
        {
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;
            parameters.GenerateExecutable = false;
            parameters.IncludeDebugInformation = true;
            parameters.OutputAssembly = "Dynamic.dll";
            var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                            .Where(a => !a.IsDynamic)
                            .Select(a => a.Location);
            parameters.ReferencedAssemblies.AddRange(assemblies.ToArray());

            CompilerResults cr = CodeDomProvider.CreateProvider("CSharp")
                .CompileAssemblyFromSource(parameters, @"          
namespace Dynamic
                    {
                        public class DynamicDllClass
                        {
                            public int X { get {return 7;}}
                        }
                    }");
            cr.CompiledAssembly.GetName().Version = new Version("1.0.0.0");
            var instance = cr.CompiledAssembly.CreateInstance("Dynamic.DynamicDllClass");
            int x = (int) instance.GetType().GetProperty("X").GetGetMethod().Invoke(instance, null);
            Debug.Assert(x==7);
            Debug.Assert(cr.CompiledAssembly.FullName.Contains("1.0.0.0"));
        }
    }
}

您需要使用反射属性将其分配给源代码文件。 代码提供者将查找它,将其提取并添加所需的元数据。

如下装饰您的源类:

using System.Reflection;

[assembly: AssemblyVersion("2.1.0.0")]
[assembly: AssemblyFileVersion("2.1.0.0")]
public class Your_Class{}

谢谢linuser

以下代码效果很好!

using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.Linq;
using System.Reflection;

namespace dynamicDll
{
    class Programs
    {
        static void Mains(string[] args)
        {
            CompilerParameters parameters = new CompilerParameters();
            parameters.GenerateInMemory = true;
            parameters.GenerateExecutable = false;
            parameters.IncludeDebugInformation = true;
            parameters.OutputAssembly = "Dynamic.dll";
            var assemblies = AppDomain.CurrentDomain.GetAssemblies()
                            .Where(a => !a.IsDynamic)
                            .Select(a => a.Location);
            parameters.ReferencedAssemblies.AddRange(assemblies.ToArray());
            var versionString = "1.0.0.0";

            CompilerResults cr = CodeDomProvider.CreateProvider("CSharp")
                .CompileAssemblyFromSource(parameters, @"
using System.Reflection;
[assembly: AssemblyVersion(" + "\"" + versionString + "\"" + @")]                    
namespace Dynamic
                    {
                        public class DynamicDllClass
                        {
                            public int X { get {return 7;}}
                        }
                    }");

            var instance = cr.CompiledAssembly.CreateInstance("Dynamic.DynamicDllClass");
            int x = (int) instance.GetType().GetProperty("X").GetGetMethod().Invoke(instance, null);
            Debug.Assert(x==7);
            Debug.Assert(cr.CompiledAssembly.FullName.Contains(versionString));
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM