我正在尝试将函数内的代码转换为字符串。有没有办法在VB.Net或C#.Net中执行此操作?例如:
Public Function Test() As String
Dim timestr As String = Now().ToString()
Return timestr
End Function
然后以某种方式将上述内容转换为字符串,即......
Dim funcstr As String = Test.ToString()
哪个funcstr等于“Dim timestr As String = Now()。ToString()返回timestr”
由于
修改
我标记了JaredPar的答案,因为它帮助解决了我的问题,即使我问的是不可能的。我的目的是获得非常敏感和复杂代码的副本,并且在实例化类时,比较两者并确保它们是准确的,以防我在编码期间意外更改了字符(人为错误)。他的解决方案让我完成了这项任务。这是我在Jared解决方案中的更新代码。谢谢!
Dim _type As Type = Me.GetType
Dim _method As System.Reflection.MethodInfo = _type.GetMethod("Test")
Dim _bytes() As Byte = _method.GetMethodBody.GetILAsByteArray()
Dim _method2 As System.Reflection.MethodInfo = _type.GetMethod("Test2")
Dim _bytes2() As Byte = _method2.GetMethodBody.GetILAsByteArray()
MsgBox(_bytes.SequenceEqual(_bytes2))
答案 0 :(得分:3)
有没有办法[获取函数的源代码] ..?
不,不是真的。
虽然功能可以被反编译" - 例如在dotPeek和ILSpy等工具中完成,这些工具允许查看" [反编译]源" - 编译时,原始函数源不可逆转换到CIL。 (虽然可以进行反编译,但它不是"标准"或者"平凡"将CIL转换回VB.NET / C#源,结果代码通常不与原始源文本相同。)
但现在问到Y问题:将函数转换为字符串表示形式的目标是什么?
答案 1 :(得分:3)
这是不可能的,因为编译的方法不是作为字符串值存储而是作为IL存储。所有语言都编译为IL,它是.Net程序的通用表示。如果这是你想要的那样,可以通过反射来检索这个IL
Dim type = TypeOf(TestContainer)
Dim method = type.GetMethod("Test")
Dim il = method.MethodBody.GetILAsByteArray();
将此转换回文本形式并不是一件简单的事情。它需要识别模式才能将try / finally
更改为using
,依此类推。