标签: system-codedom-compiler

如何以编程方式在C#中执行方法重载解析?

当C#编译器解释方法调用时,它必须使用(静态)参数类型来确定实际调用哪个重载.我希望能够以编程方式执行此操作.

如果我有一个方法(a string)的名称,声明它的类型(一个实例System.Type),以及一个参数类型列表,我希望能够调用标准库函数并获取一个MethodInfo表示C#方法的对象编译器会选择调用.

例如,如果我有

class MyClass {
  public void myFunc(BaseClass bc) {};
  public void myFunc(DerivedClass dc) {};
}
Run Code Online (Sandbox Code Playgroud)

然后,我想是这样的虚构功能GetOverloadedMethodSystem.Type

MethodInfo methodToInvoke
  = typeof(MyClass).GetOverloadedMethod("myFunc", new System.Type[] {typeof(BaseClass)});
Run Code Online (Sandbox Code Playgroud)

在这种情况下methodToInvoke应该是public void myFunc(BaseClass bc).

:既不方法GetMethodGetMethods将成为我的目的.他们都没有做任何重载决议.在GetMethod它的情况下它只返回完全匹配.如果你给它更多的派生参数,它将只返回任何东西.或者你可能有幸得到一个模糊性异常,它没有提供有用的信息.

c# reflection system.reflection overload-resolution system-codedom-compiler

21
推荐指数
1
解决办法
579
查看次数

如何将嵌入式资源作为字节数组读取而不将其写入磁盘?

在我的应用程序中,我使用CodeDom.Compiler从source.cs文件编译另一个程序,我在编译时嵌入了一些资源(exe和dll文件),使用:

 // .... rest of code

if (provider.Supports(GeneratorSupport.Resources))
{
    cp.EmbeddedResources.Add("MyFile.exe");
}
if (provider.Supports(GeneratorSupport.Resources))
{
    cp.EmbeddedResources.Add("New.dll");
}
// ....rest of code 
Run Code Online (Sandbox Code Playgroud)

在编译文件中,我需要将嵌入资源作为字节数组读取.现在我通过使用下面的函数和使用将资源提取到磁盘来实现这一点

File.ReadAllBytes("extractedfile.exe");
File.ReadAllBytes("extracteddll.dll");
Run Code Online (Sandbox Code Playgroud)

我使用此函数将两个文件解压缩到磁盘后执行此操作:

public static void ExtractSaveResource(String filename, String location)
{
    //  Assembly assembly = Assembly.GetExecutingAssembly();
    System.Reflection.Assembly a = System.Reflection.Assembly.GetExecutingAssembly();
    // Stream stream = assembly.GetManifestResourceStream("Installer.Properties.mydll.dll"); // or whatever 
    // string my_namespace = a.GetName().Name.ToString();
    Stream resFilestream = a.GetManifestResourceStream(filename);
    if (resFilestream != null)
    {
        BinaryReader br = new BinaryReader(resFilestream);
        FileStream fs = new FileStream(location, FileMode.Create); // say 
        BinaryWriter bw = new …
Run Code Online (Sandbox Code Playgroud)

.net c# codedom embedded-resource system-codedom-compiler

19
推荐指数
2
解决办法
2万
查看次数

在.netstandard 2.0上迁移后无法编译简单的动态代码(CodeDom抛出System.PlatformNotSupportedException)

尝试编译此代码示例:

var c = new CSharpCodeProvider();
var cp = new CompilerParameters();
var className = $"CodeEvaler_{Guid.NewGuid().ToString("N")}";
// doesn't work with or without netstandard reference
var netstandard = Assembly.Load("netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51");
cp.ReferencedAssemblies.Add(netstandard.Location);
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;

var sb = new StringBuilder("");

sb.Append("namespace Jobs.Dynamic{ \n");
sb.Append($"public class {className} {{\n");
sb.Append($"public object RunSnippetCode()\n{{\n");
sb.Append("\nreturn null;\n");
sb.Append("\n}\n");
sb.Append("}");
sb.Append("}");

CompilerResults cr = c.CompileAssemblyFromSource(cp, sb.ToString());
Run Code Online (Sandbox Code Playgroud)

在.netstandard 2.0上进行迁移之前,一切正常

必须生成一个简单的类,并且只要复制代码并在Visual Studio中运行它,它就可以工作。具有一个返回null的方法的类。现在,CompileAssemblyFromSource方法将引发

System.PlatformNotSupportedException:该平台不支持该操作。在Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch(CompilerParameters options,String [] fileNames)在Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch(CompilerParameters选项,String []源)在CnetContent.Jobs.Dyn。 ctor(IEnumerable 1 referencedAssemblies, IEnumerable1 usings,String methodArgs,String codeSnippet)在CnetContent.Jobs.Core.JobBase.EvalRunCondition(String&错误)

我更新了System.CodeDom,并且此库支持.netstandard …

c# codedom system-codedom-compiler .net-standard-2.0

7
推荐指数
1
解决办法
2206
查看次数

以编程方式加载嵌入式资源文件

我最近实现了以下代码,以编程方式构建项目/ exe.在这个exe版本中,我想在资源中存储一堆"实际文件"作为流.

这是我如何将文件添加到资源文件(单数),然后将该资源文件嵌入到编译器参数中:

        List<string> UserFiles = new List<string>();
        UserFiles.AddRange(Helpers.GetFilesInFolder(this.txt_Publish_Folder.Text));

        string folder = this.txt_Package_Location.Text;
        folder = folder + "\\Package_" + DateTime.Now.ToLongTimeString().Replace(":", "_").Replace(".", "_");
        Directory.CreateDirectory(folder);

        CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = true;
        parameters.IncludeDebugInformation = true;
        parameters.GenerateInMemory = false;
        parameters.WarningLevel = 3;
        parameters.CompilerOptions = "/optimize";
        parameters.OutputAssembly = folder + "\\Install_" + this.txt_AppName.Text + ".exe";
        parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
        parameters.ReferencedAssemblies.Add("System.dll");
        parameters.ReferencedAssemblies.Add("System.Core.dll");
        parameters.ReferencedAssemblies.Add("System.Data.dll");
        parameters.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll");
        parameters.ReferencedAssemblies.Add("System.Xml.dll");
        parameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");

        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
        if (codeProvider.Supports(GeneratorSupport.Resources))
        {
            string temp = Path.Combine(Path.GetTempPath(), Path.GetTempFileName());
            //create temp file first, because we want to append …
Run Code Online (Sandbox Code Playgroud)

c# embedded-resource system-codedom-compiler

6
推荐指数
1
解决办法
1344
查看次数

使用System.CodeDom生成扩展方法

有没有人试过在.NET 4.0下使用System.CodeDom生成扩展方法?似乎没有任何方法可以将CodeMemberMethod或CodeParameterDeclarationExpression指定为扩展方法/参数.

如果无法做到这一点,有什么好的解决方法吗?

谢谢

c# extension-methods codedom system-codedom-compiler

6
推荐指数
1
解决办法
939
查看次数

哪种.NET编程语言有CodeDom提供程序?

除了C#,VB.NET,C++(Managed和C++/CLI)和F#之外,哪些.NET编程语言都有自己的CodeDom提供程序?

.net codedom system-codedom-compiler

5
推荐指数
1
解决办法
1144
查看次数