修改c#dll文件
最近项目中用到了个dll来做网络方面的通讯。
由于需要低延时,高频率的调用这个dll提供的接口,项目采用了c#中的Task来做异步并发。结果出现了问题。经过调试发现时因为这个dll内部的函数对于内部数据结构的修改没有针对多线程进行同步操作,从而导致内部出现逻辑错误。
这个dll是另一个厂商提供的,等他们改需要一段时间。我就想我能不能反编译,自己修改以后再让程序调用我修改过的版本呢?
首先visiual studio对c#的反编译无比优秀,变量名,函数名悉数保留,就差没保留注释了。另一个工具是c# reflector。这个工具的激活码生成器可以在52pj的爱盘里面找到。
先用reflector载入dll,可以右键将其反编译结果导出。导出以后有个csproj文件,可以用visual studio打开这个文件,就能看到反编译得到的工程了。眼看着只要改代码然后编译就好了,但是事情还没那么简单。
首先,reflector似乎对一些特殊语法的反编译有问题,我在两个地方遇到问题。一个是linq,还有一个是yield。不过还好visual studio本身对这两种语法的解析没问题,所以可以直接把正常的代码从vs中copy到项目源代码中。
另一个问题是修改好代码以后点击生成,总是报错“error : The BaseOutputPath/OutputPath property is not set for project”。经过数小时的挣扎,试了网上的各种方法都没用。最终放弃挣扎。直接把csproj文件中,除了你想要的那个PropertyGroup和某人的PropertyGroup(就是一般最上面那个),其他的PropertyGroup全部删掉,然后打开开始菜单,输入devel,点击development command prompt for vs,然后进入你需要的目录,运行msbuild xxx.csproj就完事了哈哈哈。对了还有,这样默认生成的不知道为啥是xxx.exe.手动把exe改成dll就好。
目前我已经改好了dll,等着明天试试看改的成不成功。