《reflector kBackingField 问题解决方法》.docx

上传人:b****0 文档编号:9217186 上传时间:2023-05-17 格式:DOCX 页数:16 大小:51.52KB
下载 相关 举报
《reflector kBackingField 问题解决方法》.docx_第1页
第1页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第2页
第2页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第3页
第3页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第4页
第4页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第5页
第5页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第6页
第6页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第7页
第7页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第8页
第8页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第9页
第9页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第10页
第10页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第11页
第11页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第12页
第12页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第13页
第13页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第14页
第14页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第15页
第15页 / 共16页
《reflector kBackingField 问题解决方法》.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《reflector kBackingField 问题解决方法》.docx

《《reflector kBackingField 问题解决方法》.docx》由会员分享,可在线阅读,更多相关《《reflector kBackingField 问题解决方法》.docx(16页珍藏版)》请在冰点文库上搜索。

《reflector kBackingField 问题解决方法》.docx

《reflectorkBackingField问题解决方法》

k__BackingField与反编译

 今天反编译umbraco的组件ProWorksRedirectPagev1.03,看到代码中有:

[CompilerGenerated]

privatestringk__BackingField;

立马汗颜,自己搞C#到现在,也自称不是倒数第一,却没有见过这种形式。

马上baidu,释怀!

是反编译的原因!

找到一篇很好的文章,转载如下:

《reflector<....>k__BackingField问题解决方法》

使用reflector后生成的源代码出现:

privatestringk__BackingField;

这样的问题,造成编译失败。

解决方法:

因为菜,所以不能改reflector,只好改生成的源代码了,使用.net的在文件中替换的功能来解决:

1、Ctrl+Shift_H打开替换窗口;

2、如下图示,使用正则表达式替换;

 

查找内容:

\<{.#}\>k__BackingField

替换内容:

_\1_k__BackingField

3、结束。

没办法,懒人就是这个样子,谁让生成的代码里边这种错误这么多呢,要不然也用不着这个方法了。

===============================================================================

goldarch:

有网友自己写一段代码,反编译,观察结果如下:

CompilerGenerated是反编译生成的代码如

 publicclassMyClass

{

publicstringName{set;get;}

publicstringValue{set;get;}

publicMyClass(stringpName,stringpValue)

{

Name=pName;

Value=pValue;

}

}

反编译后

反编译后

publicclassMyClass

{

//Fields

[CompilerGenerated]

privatestringk__BackingField;

[CompilerGenerated]

privatestringk__BackingField;

//Methods

publicMyClass(stringpName,stringpValue)

{

base..ctor();

this.Name=pName;

this.Value=pValue;

return;

}

//Properties

publicstringName

{

[CompilerGenerated]

get

{

stringstr;

str=this.k__BackingField;

Label_0009:

returnstr;

}

[CompilerGenerated]

set

{

this.k__BackingField=value;

return;

}

}

publicstringValue

{

[CompilerGenerated]

get

{

stringstr;

str=this.k__BackingField;

Label_0009:

returnstr;

}

[CompilerGenerated]

set

{

this.k__BackingField=value;

return;

}

}

}

=============================================

goldarch结论:

形如k__BackingField只不过就是一"变量命名"!

只不过vs不认这个命名而以,把这个命名改成vs能认的命名就可以了。

PWUrlRedirect代码简短,我直接把k__BackingField改成_url,编译通过

需要注意的是:

要主动应用"替换"功能,vs自动的替换没有作用(它根本不认为那是变量,不会主动替换的)。

 

Refactor反编译C#程序

2011-01-1415:

51911人阅读评论(0)收藏举报

两篇很不错reflector的教程,很有用~

Reflactor就不介绍了,.net下的免费反编译工具。

Reflactor在某些情况下是很必须的,当遇到bug的时候,可以通过Reflactor看其内部的实现机制,从而找到真正的bug所在。

或者可以通过reflactor查看私有生成,然后在用反射去调用。

上面说的都是正当用途,有的时候也可以用来反编译别人的软件。

混淆了的软件,我就不管了。

这里要讲的是没有混淆和加密的软件的反编译。

reflector的右键菜单中的export就能做到反编译,如下图:

反编译的文件默认保存在MyDocuments/Reflector/Disassembler下,但是这个反编译有一些问题,对于winform的资源文件无法反编译。

这就需要我们另寻他法。

经过我的不懈努力找到了一个插件Filedessassemble,他能实现这样的功能。

反编译出来后,用visualsutio打开后就能编辑了,但是有时候会有一些问题。

下面总结一下。

1、编译没有问题,运行出现"类型初始值设定项引发异常"

这主要是在类中使用了两个静态变量,而其中一个静态变量的初始化依赖令一个静态变量,而被依赖的静态变量放在依赖变量的前面,比如下面的代码就会出现这样的问题。

Code

1private static string SettingFileName = Path.Combine(SettingFolderPath, @"GoogleMusicDesktop/config.xml");

2public static string SettingFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "aaaSoft");

问题很好解决,掉个个就解决了。

2、出现无法找到资源文件,如图片等

这种情况一般是和资源文件的命名如果,请把资源文件命名保持和类一直,重新编译一下就会解决问题,注意需要重新生成,否则就不一定好使了。

3、打开form的时候出现错误

这个问题,我通过搜索解决了,园子里有一篇文章,我转过来。

转载文章

 用Reflector和FileDisassembler配合反编译.net Windows程序

URL:

 

用FileDisassembler反编译Windows Application出现了问题,resx资源文件和cs文件不匹配,项目编译根本通不过,把resx文件修改放入cs文件夹后,虽然运行没有

问题,但是不能直接在窗体设计里面"可视地"修改控件,一来麻烦,二来不直观,那么就应该修改下源代码,使其符合VS2008的源文件布局.

下面总结一下修改的步骤:

1.由于FileDisassembler会给每个命名空间生成一个目录,保存这个空间的源代码,而对于资源resx文件就是直接加在项目目录下,所有要把它放回源码目录下.例如

对于项目文件夹里面的TryAssemb.Form1.resx,首先改为Form1.resx然后移动到TryAssemb目录里面.

2.然后对窗体打开"视图设计器",发现会出现下面的错误:

修改方法就是对所有System.Windows.Forms.命名空间里面的控件需要全命名空间的声明,例如里面 base.AutoScaleMode = AutoScaleMode.Font;就要改成base.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;而TextBox textBox1; 也要改成private System.Windows.Forms.TextBox textBox1;这样VS2008就能识别到这个控件是要绘制在Form上面的.

PS.开始是的时候还以为要像VS一样把Form1拆开成Form1.cs和Form1.Designer.cs.每次是都辛辛苦苦拆开,最后才发现原来根本不需要,^_^.

相信大多数.Net程序员都有使用Reflactor的经历。

无论出于什么目的,当用Reflactor反编译托管程序后,还想对其代码加以修改,那么本文所列举的可能是一份有用的参考。

用Reflactor的FileGenerator插件反编译代码后可以得到包括项目文件的源代码,但代码中存在各种问题,一般无法一次编译通过,以下将详谈这些问题:

枚举问题

为了代码可读,可能需要花点时间查阅metadata把int值修改回枚举值,尤其是想利用窗体设计器的,VS2008可能还不理解int值。

属性问题

比如一个叫Names的属性被反编译后,可能还原为的set_Names(names),get_Names()方法,逐个替换可能很慢,可采用正则表达式整体替换。

对于set_Xxx(xxx)方法,可替换

set_{[a-z]*}/(

/1 = (

对于get_Xxx()方法,可替换

get_{[a-z]*}/(/)

/1

然后,再修复个别被误换的方法。

委托和回调函数问题

一般会被还原为add_Xxx(MethodsName)方法,需要改为 += MethodsName

资源问题

需要使用.Net Framework SDK 下的 resgen.exe 工具,反编译嵌入资源文件*.resources为*.resx文件,

语法为:

ResGen.exe *.resources *.resx,然后将*.resx包含入项目,就会自动和同名的窗体文件*.cs关联,如果没有关联可采用先排除再添加大法,一一搞定。

命名空间问题

如果需要切换到IDE的窗体设计器,而不出错,则还需要在*.cs中添加比如System.Windows.Forms的命名空间前缀。

窗体设计器识别问题

需要把以下代码

ComponentResourceManager manager = new ComponentResourceManager(typeof(ClassName));

替换为

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ClassName));

窗体设计器才能正常识别。

本文来自CSDN博客,转载于:

 

 

 

 用Reflector和FileDisassembler配合反编译.netWindows程序 收藏

URL:

 

 

用FileDisassembler反编译WindowsApplication出现了问题,resx资源文件和cs文件不匹配,项目编译根本通不过,把resx文件修改放入cs文件夹后,虽然运行没有

问题,但是不能直接在窗体设计里面"可视地"修改控件,一来麻烦,二来不直观,那么就应该修改下源代码,使其符合VS2008的源文件布局.

下面总结一下修改的步骤:

1.由于FileDisassembler会给每个命名空间生成一个目录,保存这个空间的源代码,而对于资源resx文件就是直接加在项目目录下,所有要把它放回源码目录下.例如

对于项目文件夹里面的TryAssemb.Form1.resx,首先改为Form1.resx然后移动到TryAssemb目录里面.

2.然后对窗体打开"视图设计器",发现会出现下面的错误:

修改方法就是对所有System.Windows.Forms.命名空间里面的控件需要全命名空间的声明,例如里面上图的base.AutoScaleMode=AutoScaleMode.Font;就要改成base.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font;而TextBoxtextBox1;也要改成privateSystem.Windows.Forms.TextBox textBox1;这样VS2008就能识别到这个控件是要绘制在Form上面的.

PS.开始是的时候还以为要像VS一样把Form1拆开成Form1.cs和Form1.Designer.cs.每次是都辛辛苦苦拆开,最后才发现原来根本不需要,^_^.

 

 

 

相信大多数.Net程序员都有使用Reflactor的经历。

无论出于什么目的,当用Reflactor反编译托管程序后,还想对其代码加以修改,那么本文所列举的可能是一份有用的参考。

 

用Reflactor的FileGenerator插件反编译代码后可以得到包括项目文件的源代码,但代码中存在各种问题,一般无法一次编译通过,以下将详谈这些问题:

枚举问题

 

为了代码可读,可能需要花点时间查阅metadata把int值修改回枚举值,尤其是想利用窗体设计器的,VS2008可能还不理解int值。

属性问题

 

比如一个叫Names的属性被反编译后,可能还原为的set_Names(names),get_Names()方法,逐个替换可能很慢,可采用正则表达式整体替换。

对于set_Xxx(xxx)方法,可替换

set_{[a-z]*}/(

/1=(

对于get_Xxx()方法,可替换

get_{[a-z]*}/(/)

/1

然后,再修复个别被误换的方法。

委托和回调函数问题

 

一般会被还原为add_Xxx(MethodsName)方法,需要改为+=MethodsName

资源问题

 

需要使用.NetFrameworkSDK下的resgen.exe工具,反编译嵌入资源文件*.resources为*.resx文件,

语法为:

ResGen.exe*.resources*.resx,然后将*.resx包含入项目,就会自动和同名的窗体文件*.cs关联,如果没有关联可采用先排除再添加大法,一一搞定。

命名空间问题

 

如果需要切换到IDE的窗体设计器,而不出错,则还需要在*.cs中添加比如System.Windows.Forms的命名空间前缀。

窗体设计器识别问题

 

需要把以下代码

ComponentResourceManagermanager=newComponentResourceManager(typeof(ClassName));

替换为

System.ComponentModel.ComponentResourceManagerresources=newSystem.ComponentModel.ComponentResourceManager(typeof(ClassName));

窗体设计器才能正常识别。

CompilerGenerated是反编译生成的代码如

 publicclassMyClass

{

publicstringName{set;get;}

publicstringValue{set;get;}

publicMyClass(stringpName,stringpValue)

{

Name=pName;

Value=pValue;

}

}

反编译后

反编译后

publicclassMyClass

{

//Fields

[CompilerGenerated]

privatestringk__BackingField;

[CompilerGenerated]

privatestringk__BackingField;

//Methods

publicMyClass(stringpName,stringpValue)

{

base..ctor();

this.Name=pName;

this.Value=pValue;

return;

}

//Properties

publicstringName

{

[CompilerGenerated]

get

{

stringstr;

str=this.k__BackingField;

Label_0009:

returnstr;

}

[CompilerGenerated]

set

{

this.k__BackingField=value;

return;

}

}

publicstringValue

{

[CompilerGenerated]

get

{

stringstr;

str=this.k__BackingField;

Label_0009:

returnstr;

}

[CompilerGenerated]

set

{

this.k__BackingField=value;

return;

}

}

}

C#请教属性问题

2011-11-100:

42

提问者:

__平淡_|浏览次数:

26次

classperson

{

publicstringName{set;get;}//这边为什么不用return;

}

classperson

{

publicstringName

{

set{}

get{return"a";}

}

}

那两种方法有什么不同?

为什么第一种get不用返回一个值,而第二个却要。

还有第二个set他的值为什么不能存在Name中,而第一个却可以?

麻烦知道的解释一下,谢谢了。

2011-11-107:

37

最佳答案

第一种是08版本的VS的新特性,叫自动属性

其实在编译完成之后他会为你做一件事

classperson

{

publicstringName{set;get;}//这边为什么不用return;

}

编译完成后其实是这样的

classperson

{

[CompilerGenerated]

privatestringk__BackingField;

publicstringName

{

[CompilerGenerated]

get

{

returnthis.k__BackingField;

}

[CompilerGenerated]

set

{

this.k__BackingField=value;

}

}

只是说你不用添加了而已

在05之前的版本,我们用属性都是这样写的

classperson

{

privatestringname;

publicstringName

{

set{this.name=value;}

get{returnthis.name;}

}

}

在get块中必须return,在set块中有一个隐式参数,叫vlaue这个代表调用时传进来的值

其他回答共2条

2011-11-109:

15wggfcusmq|四级

前面那个属性叫自动属性,是.net3.0后,微软对属性定义简化后推出的。

它其实和一开始的属性

publicstring_name;

publicstringName{

get{return_name;}

set{_name=value}

}

是一样的,只是简化了_name的定义过程。

而第二个为什么set的值不能存在Name,是因为你的get中总是return"a",所以其实set的值已经存在于Name中,但总是返回了get中的"a".如果你要返回set的值,要么用你的第一种方法自动属性,要么用我上面的例子样定义:

publicstring_name;

publicstringName{

get{return_name;}

set{_name=value}

}

2011-11-110:

14丨丨零度丨丨|三级

第一种编译器会自动帮你补全代码。

第二种编译器不过做任何处理,你的Set块里没有语句所以赋值不会有任何动作。

而且Get块始终返回"a",所以该属性的值始终是"a"。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2