我正在寻找为使用codeDOM生成的exe文件设置文件版本的任何方法.我的总是0.0.0.0.编程显然是首选,但在这一点上,任何东西都会好于没有.
我知道CodeGear制作的BabelCode使用Code DOM将C#转换为Delphi for .NET.我很好奇是否还有其他类似工具将C#转换为Delphi Prism?如果没有,使用Code DOM创建一个是什么(是的,这是开放式的!)
更新:现在已经内置到Delphi Prism中.只需粘贴或导入您的C#,您就拥有了Oxygene即Delphi Prism Code.
我使用MSDN上的教程创建了自己的小c#编译器,但它无法正常工作.我得到一些错误,然后我修复它们,然后我得到新的,不同的错误,然后我修复它们等等.
最新的错误让我很困惑.
---------------------------
---------------------------
Line number: 0, Error number: CS0006, 'Metadata file 'System.Linq.dll' could not be found;
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
我不知道这是什么意思.
有人可以解释一下这里发生了什么吗?
这是我的代码.
我的样本C#编译器代码: 使用系统;
namespace JTM
{
public class CSCompiler
{
protected string ot,
rt,
ss, es;
protected bool rg, cg;
public string Compile(String se, String fe, String[] rdas, String[] fs, Boolean rn)
{
System.CodeDom.Compiler.CodeDomProvider CODEPROV = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
ot =
fe;
System.CodeDom.Compiler.CompilerParameters PARAMS = new System.CodeDom.Compiler.CompilerParameters();
// Ensure the compiler generates an EXE file, not a DLL.
PARAMS.GenerateExecutable = …Run Code Online (Sandbox Code Playgroud) 我有两种方法; 其中一个位于一个类之外,另一个位于类中.我希望能够使用CodeDom从类外部的方法调用到类内部的方法.通过使用代码,这将更容易解释...
内部方法类:
public static class Public
{
public static byte[] ReadAllData(string sFilePath)
{
byte[] b = new byte[sFilePath.Length];
b = System.IO.File.ReadAllBytes(sFilePath);
return b;
}
}
Run Code Online (Sandbox Code Playgroud)
**来自另一个班级:
Public.ReadAllData(@"C:\File.exe");
Run Code Online (Sandbox Code Playgroud)
我想重新创建以上使用 CodeDom -
CodeMemberMethod method = new CodeMemberMethod();
method.Statements.Add(new CodePropertyReferenceExpression(
new CodeVariableExpression("Public"), "ReadAllData"));
Run Code Online (Sandbox Code Playgroud)
上面的代码将产生以下输出 - 但请注意我无法传递任何参数!
Public.ReadAllData;
Run Code Online (Sandbox Code Playgroud) 我一直在努力让CodeDom工作,所以我可以在运行时为我的应用程序动态创建代码.然而,经过许多教程和反复试验,我遇到了一个我似乎无法通过的问题.我一直在代码看起来完全像应该编译错误.当我的代码中没有'\'时,我得到"无法识别的转义序列'\'".
我得到的错误都在第1行.这里它们是有序的:CS1009 CS1056(连续3次)CS0116
这是我有的:
正在编译的代码:
using System;
using System.Windows.Forms;
namespace sdjkfhj
{
public class Sample
{
public static void main()
{
MessageBox.Show("Working");
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译器代码如下:
public void Compile(string file)
{
var prov = new Dictionary<string, string>();
prov.Add("CompilerVersion", "v2.0");
CSharpCodeProvider c = new CSharpCodeProvider();
ICodeCompiler comp = c.CreateCompiler();
CompilerParameters param = new CompilerParameters();
param.GenerateExecutable = true;
param.OutputAssembly = file + ".exe";
param.ReferencedAssemblies.Add("System.dll");
param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
if (c.Supports(GeneratorSupport.EntryPointMethod))
param.MainClass = "Sample";
CompilerResults results = comp.CompileAssemblyFromSource(param, file);
if (results.Errors.Count > 0)
{
foreach …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,使用CodeDom编译器创建一些代码.我可以看到生成的程序集在内存中.但是当我调用Type.GetType(typeName)时,它返回null.我发现这有点令人困惑.
我究竟做错了什么?
static void Main(string[] args)
{
// FYI: Code is some dummy class with only 1 instance method.
string code = System.IO.File.ReadAllText("CodeToCompile.cs.txt");
string errors = null;
Assembly asm = DynamicCompiler.Compile(code, generateInMemory: true, generateDebugInfo: false, message: ref errors);
// Get type from the generated assembly. We know there is only one.
Type oneAndOnlyTypeInAssembly = asm.GetTypes().First();
string typeName = oneAndOnlyTypeInAssembly.AssemblyQualifiedName;
// Tell the type system to return instance of type based on fully qualified name.
// I'd expect this to work, …Run Code Online (Sandbox Code Playgroud) 我发现这个程序(http://support.microsoft.com/kb/304655),其中i编译运行时的代码,它适用于使用参考代码,
using System;
Run Code Online (Sandbox Code Playgroud)
以下是在运行时编译代码的程序代码,
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
string Output = "Out.exe";
Button ButtonObject = (Button)sender;
textBox2.Text = "";
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
//Make sure we generate an EXE, not a DLL
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = icc.CompileAssemblyFromSource(parameters, textBox1.Text);
if (results.Errors.Count > 0)
{
textBox2.ForeColor = Color.Red;
foreach (CompilerError CompErr in results.Errors)
{
textBox2.Text = textBox2.Text +
"Line number " + CompErr.Line +
", Error Number: " + …Run Code Online (Sandbox Code Playgroud) 我使用SE中的CodeDOM找到了类名验证方法,我用它:
System.CodeDom.Compiler.CodeGenerator.IsValidLanguageIndependentIdentifier(string value)
通过此链接:是否有.NET函数来验证类名?
但是,类名不允许'.' (OEM期间)名称空间可以是这样的:
System.Linq例如,允许'.'.在寻找Regex用于验证命名空间名称的选项或循环之前,我想知道.NET中是否有任何方法可用于此任务.
编辑:
实际情况是,我有一个来自.用户可以从文本框中提供类名和命名空间.对于该类名和命名空间,我将提供生成的代码.如果用户输入SomeClass作为类名,Some.Namespace作为名称空间,则生成的代码将为:
namespace Some.Namespace
{
class SomeClass{}
}
Run Code Online (Sandbox Code Playgroud)
为此,我需要验证用户输入的这两个名称.
我正在使用CodeDom生成我的WCF服务接口和实现文件.我在CodeMemberMethod上找不到任何可以生成接口方法的选项.如果我使用MemberAttributes.Abstract,我几乎就在那里,但它包含对接口无效的abstract关键字.有谁知道生成方法的正确语法?
这是我为生成接口文件而开发的代码:private void CreateServiceContractFile(Type entity,BoElement bo,DirectoryInfo serviceOutputDir,AppParameters appPrams){CodeCompileUnit serviceFileUnit = new CodeCompileUnit();
CodeNamespace importNameSpace = new CodeNamespace("");
importNameSpace.Imports.Add(new CodeNamespaceImport("System"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Linq"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Runtime.Serialization"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.ServiceModel"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.ServiceModel.Web"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Text"));
importNameSpace.Imports.Add(new CodeNamespaceImport("ALVIN.BusinessObjects"));
importNameSpace.Imports.Add(new CodeNamespaceImport("DAOObjects = ALVIN.DAO"));
importNameSpace.Imports.Add(new CodeNamespaceImport("ALIAS.BusinessObjects"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Data.Entity.Validation"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.ComponentModel.DataAnnotations"));
importNameSpace.Imports.Add(new CodeNamespaceImport("System.Data.Objects"));
importNameSpace.Imports.Add(new CodeNamespaceImport("ALIAS.Common.Utility"));
importNameSpace.Imports.Add(new CodeNamespaceImport("ALIAS.EventMessages"));
importNameSpace.Imports.Add(new CodeNamespaceImport("ALIAS.ServiceCommon"));
importNameSpace.Imports.Add(new CodeNamespaceImport(appPrams.BoNameSpace));
serviceFileUnit.Namespaces.Add(importNameSpace);
string serviceName = string.Format("{0}Service", entity.Name);
CodeTypeDeclaration serviceClass = new CodeTypeDeclaration(serviceName);
serviceClass.IsClass = true;
serviceClass.BaseTypes.Add(new CodeTypeReference("I" + serviceName));
serviceClass.TypeAttributes = TypeAttributes.Public;
serviceClass.Comments.AddRange(Helper.CreateComment("The Service Contract class"));
CodeParameterDeclarationExpression headerParm …Run Code Online (Sandbox Code Playgroud) 我想使用CodeDom编写如下内容:
.Where(x => x.Id == 2);
Run Code Online (Sandbox Code Playgroud)
我不知道CodeDom(System.CodeDom)中的等效功能。