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

标签 c# dll reflection

我需要一些帮助来设置动态创建的 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"));
        }
    }
}

最佳答案

谢谢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));
        }
    }
}

关于c# - 如何在动态创建的dll上设置版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31935284/

相关文章:

.net - 如何通过 C# 中的反射调用采用 'method group' 即的方法。操作<>或功能<>

c# - WCF 服务返回数据集

c# - 使用方法属性消除冗余代码

php - 在哪里可以找到 php_printer.dll?

scala - 通过反射列出 Scala 嵌套对象方法

reflection - 如何在 Java 内部使用 Java 9 的反射?

c# - 为什么 C# 是一种快速应用程序开发 (RAD) 语言?

c# - 如何在 wpf 中使用 RelayCommand?

c# - 从 VB6 DLL 项目调试 C#.Net DLL 项目

c# - 在 C# 类库中,如何检测 DLL 何时将被卸载?