我正在写一个桌面应用程序.它需要在客户端机器上生成c#代码.
我想过使用CodeDOM(复杂)或简单的字符串操作(脆弱).还有什么?推荐哪种方式?
假设我在主项目中编译了一串代码,如下所示.但我想在CustomClass中实现一个接口.接口位于我的解决方案中的另一个项目中(我的主项目中的部分引用)当我这样做时
公共类CustomClass:InterfaceType
我收到这样的错误.如何在动态代码中引用其他项目以便我可以使用接口和其他类?
c:\ Users\xxx\AppData\Local\Temp\m8ed4ow-.0.cs(1,32:错误CS0246:找不到类型或命名空间名称'InterfaceType'(您是否缺少using指令或程序集引用) ?)
string code2 =
" public class CustomClass : InterfaceType " +
" {" +
" }";
// Compiler and CompilerParameters
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
CompilerParameters compParameters = new CompilerParameters();
compParameters.GenerateInMemory = false; //default
//compParameters.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
compParameters.IncludeDebugInformation = true;
//compParameters.TempFiles.KeepFiles = true;
compParameters.ReferencedAssemblies.Add("System.dll");
CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
// Compile the code
CompilerResults res = codeProvider.CompileAssemblyFromSource(compParameters, code2);
// Check the compiler results for errors
StringWriter sw = new StringWriter();
foreach (CompilerError ce …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个具有自定义属性的类,如下所示:
public class Head : Attribute
{
public Head(Permissions permission, int id)
{
Permission = permission;
Id = id;
}
public int Id { get; private set; }
public Permissions Permission { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
其中 Permissions 是一个枚举:
public enum Permissions { R, W, D, RW, RWD }
Run Code Online (Sandbox Code Playgroud)
所以当我生成属性时:
var head = new CodeAttributeDeclaration
{
Name = "Head",
Arguments =
{
new CodeAttributeArgument
{
Value = new CodePrimitiveExpression(Permissions.RWD)
},
new CodeAttributeArgument
{
Value = new CodePrimitiveExpression(idValue);
}
} …Run Code Online (Sandbox Code Playgroud) public void CreateMethod()
{
CodeMemberMethod mymethod = new CodeMemberMethod();
mymethod.Name = testMethod;
CodeTypeReference ctr = new CodeTypeReference();
//Assign the return type to the method.
mymethod.ReturnType = ctr;
CodeSnippetExpression snippet1 = new CodeSnippetExpression("AutomationBase obj = new AutomationBase()");
CodeSnippetExpression snippet2 = new CodeSnippetExpression("obj.Execute(testCases[1])");
CodeExpressionStatement stmt1 = new CodeExpressionStatement(snippet1);
CodeExpressionStatement stmt2 = new CodeExpressionStatement(snippet2);
mymethod.Statements.Add(stmt1);
mymethod.Statements.Add(stmt2);
mymethod.Attributes = MemberAttributes.Public;
myclass.Members.Add(mymethod);
}
Run Code Online (Sandbox Code Playgroud)
产量
public virtual void TestCaseId002() {
AutomationBase obj = new AutomationBase();
obj.Execute(testCases[1]);
}
Run Code Online (Sandbox Code Playgroud)
获得虚拟无效
我只需要无效.
我设法使用CodeDom创建一个类,并向该类添加一个方法.现在,有没有办法构建CodeCompileUnit实例,编译代码并调用生成的方法?方法调用必须在与代码生成相同的上下文中完成.
我有一些我想用Microsoft.CSharp.CSharpCodeProvider类编译的源代码,我想要包含特定于调试版本的东西(例如,标有该[Condtional("DEBUG")]属性的方法).
我尝试将CompilerParameters.CompilerOptions属性设置为"/ debug",但是当我运行已编译的代码时,似乎没有包含调试内容; 所以我怀疑这不是完成我想要的正确方法.
我怎样才能做到这一点?
我需要将字符串转换为可执行代码。该string是在foreach声明。
foreach (InsuredItem _i in p.InsuredItems)
{
string formula = "(_i.PremiumRate/100)*SumAssured";
_i.Premium = (Execute formula);
}
Run Code Online (Sandbox Code Playgroud)
公式是从设置加载的。这只是一个示范。我需要在 foreach 循环中执行字符串。谢谢。
我想在CodeDom中添加多个CompilerOptions,但是我不知道该怎么做。
我目前正在尝试的是:
CompilerParameters cp = new CompilerParameters(referencedAssemblies, "executable file path", false);
cp.CompilerOptions = "/unsafe";
cp.CompilerOptions = "/t:winexe";
Run Code Online (Sandbox Code Playgroud)
问题是只有两个参数中的后一个被合并到输出可执行文件中。有什么方法可以将CompilerOptions参数添加为数组吗?
感谢您的任何帮助,
埃文
CodeDom中生成以下代码.当我将目标框架设置为.net 4.0时,它可以正常工作 - 没有错误或警告.当我将目标框架设置为.net 2.0时,我收到以下错误:
CS1526:新类型表达式需要()或[]
test soVar;
soVar = new test { foo = 0x10007 }; // Error occurs on this line
[StructLayout(LayoutKind.Sequential)]
struct test
{
public uint foo;
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?!为什么切换到.net 2.0会突然引发错误?
期待这里的任何想法.
谢谢,
埃文
我用C#编写了一个构建器,用CodeDom编译代码.编译后的.exe必须显示一个MessageBox,但它不会这样做.一切正常,.exe被编译和生成,但输出不起作用(MessageBox没有出现).
这是我的代码:
private void button1_Click(object sender, EventArgs e)
{
String InputCode = String.Empty;
//Unser TestCode, in dem Wir ein MessageBox aufrufen
InputCode = "MessageBox.Show((1 + 2 + 3).ToString());"; //Here is the MSGBox
System.CodeDom.Compiler.CodeDomProvider CodeDomProvider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("CSharp");
//Parameter für die Compilierung, wie die einzubindenen Bibliotheken usw.
System.CodeDom.Compiler.CompilerParameters CompilerParameters = new System.CodeDom.Compiler.CompilerParameters();
CompilerParameters.ReferencedAssemblies.Add("System.dll");
CompilerParameters.OutputAssembly = "Outpu2t.exe";
CompilerParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");
CompilerParameters.CompilerOptions += "/target:winexe" + " " + "/win32icon:" + "\"" + textBox6.Text + "\"";
CompilerParameters.GenerateExecutable = true;
CompilerParameters.GenerateInMemory = false;
//Über den StringBuilder wird der …Run Code Online (Sandbox Code Playgroud) 我想生成用于创建哈希表对象的代码,并为其分配密钥和值编程.它应该类似于
Hashtable ht = new Hashtable();
ht.Add( "key1", "value1" );
ht.Add( "key2", "value2" );
ht.Add( "key3", "value3" );
Run Code Online (Sandbox Code Playgroud)
例如
CodeMemberMethod testMethod = new CodeMemberMethod();
testMethod.Name = "Test" + mi.Name + "_" + intTestCaseCnt;
testMethod.Attributes = MemberAttributes.Public;.....
Run Code Online (Sandbox Code Playgroud)
这里它创建了一个方法programacticaly现在我想创建一个哈希表,所以我问如何?
当我尝试使用CodeDom编译源代码时出现此错误
不包含适用于入口点的静态"主"方法!
我已经在Google上搜索并阅读了其他答案,但我不知道如何修复它.
有人可以帮帮我吗?这是我的源代码:http: //picz.to/image/ao5n
^ private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog d = new SaveFileDialog();
d.Filter = "Executable (*.exe)|*.exe";
if (d.ShowDialog() == DialogResult.OK)
{
string source = Properties.Resources.source;
CompilerParameters param = new CompilerParameters();
param.CompilerOptions += "/target:winexe" + " " + "/win32icon:" + "\"" + textBox1.Text + "\"";
param.GenerateExecutable = true;
param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
param.ReferencedAssemblies.Add("System.dll");
param.OutputAssembly = d.FileName;
StringBuilder Temp = new StringBuilder();
String InputCode = String.Empty;
InputCode = "MessageBox.Show((1 + 2 + 3).ToString());";
Temp.AppendLine(@"using System;");
Temp.AppendLine(@"using System.Windows.Forms;"); …Run Code Online (Sandbox Code Playgroud)