簡體   English   中英

C# GenerateCodeFromCompileUnit 正在生成帶有特殊字符的代碼 [Microsoft.CSharp.CSharpCodeProvider]

[英]C# GenerateCodeFromCompileUnit is Generating Code with Special Characters [Microsoft.CSharp.CSharpCodeProvider]

我正在使用GenerateCodeFromCompileUnitIndentedTextWriterC#源文件生成代碼。 這樣做我可以生成一個.cs文件。 但是我看到在每個聲明的變量和 Function 返回類型之前插入了一個特殊字符@ 這是我的代碼。

我正在使用Class來保存要插入的 Function 詳細信息。

Dim provider As Microsoft.CSharp.CSharpCodeProvider
Dim options = New System.CodeDom.Compiler.CompilerParameters
options.ReferencedAssemblies.Add("System.dll")
options.GenerateExecutable = False
options.GenerateInMemory = True
options.IncludeDebugInformation = True
options.OutputAssembly = "FunctionEvaluated.dll"

Dim compileUnit As System.CodeDom.CodeCompileUnit
compileUnit = New CodeDom.CodeCompileUnit
Dim codeNamespace = New CodeDom.CodeNamespace("NewNamespace")

compileUnit.Namespaces.Add(codeNamespace)

Dim classForCompile = New CodeDom.CodeTypeDeclaration("NewAction")
codeNamespace.Types.Add(classForCompile)

Dim functionToEvaluate = New CodeDom.CodeMemberMethod()

Dim returnType As CodeDom.CodeTypeReference

If functionClass.FunctionNameAndType.Select(Function(fn) fn.Value)(0).ToString() = "void" Then
    returnType = New CodeDom.CodeTypeReference("void")
Else

    returnType = New CodeDom.CodeTypeReference(functionClass.FunctionNameAndType.Select(Function(fn) fn.Value)(0).ToString())
End If

Dim parameterExpressionCollection = New CodeDom.CodeParameterDeclarationExpressionCollection()

For Each ip In functionClass.FunctionNameIP


    For Each fnIP In ip.Value
        Dim parameterExpression As CodeDom.CodeParameterDeclarationExpression
        parameterExpression = New CodeDom.CodeParameterDeclarationExpression(fnIP.Value.ToString(), fnIP.Key.ToString())

        parameterExpressionCollection.Add(parameterExpression)
    Next
Next

functionToEvaluate.Name = functionClass.FunctionNameAndType.Select(Function(fn) fn.Key)(0).ToString()
functionToEvaluate.ReturnType = returnType
functionToEvaluate.Parameters.AddRange(parameterExpressionCollection)


classForCompile.Members.Add(functionToEvaluate)

provider = New Microsoft.CSharp.CSharpCodeProvider
Dim sourceFile As String
sourceFile = "FunctionEvaluated.cs"
Dim tw As IndentedTextWriter = New IndentedTextWriter(New StreamWriter(sourceFile, False), vbTab)
provider.GenerateCodeFromCompileUnit(compileUnit, tw, New CodeGeneratorOptions())
tw.Close()

Output

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace NewNamespace {
    
    
    public class NewAction {
        
        private @int functionAdd(@int b, @int a) {
        }
    }
}

我相信你的問題在於

New CodeDom.CodeTypeReference(functionClass.FunctionNameAndType.Select(Function(fn) fn.Value)(0).ToString())

parameterExpression = New CodeDom.CodeParameterDeclarationExpression(fnIP.Value.ToString(), fnIP.Key.ToString())

我懷疑使用字符串指定本機類型會導致 DOM 認為這是用戶定義的類型“int”並用 @ 屏蔽它以防止使用本機int 來自https://en.wikipedia.org/wiki/C_Sharp_syntax#Keywords

如果需要與保留關鍵字相同的標識符,則可以在其前面加上 @ 字符以區分它

為了確保 output 使用像int這樣的本機類型,您可以嘗試使用

new CodeTypeReference(typeof(int))

換句話說,使用帶有public CodeTypeReference(Type type);的真實Type 構造函數。

要從命名類型的字符串中獲取真正的類型,可以使用Type.GetType(String) function。

所以試試這個:

New CodeDom.CodeTypeReference(Type.GetType(functionClass.FunctionNameAndType.Select(Function(fn) fn.Value)(0).ToString()))

parameterExpression = New CodeDom.CodeParameterDeclarationExpression(Type.GetType(fnIP.Value.ToString()), fnIP.Key.ToString())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM