外部操作不同长度的C#字符串

时间:2014-11-06 18:10:08

标签: c#

我有一个非常独特的问题需要解决。

我有一个已编译的C#应用​​程序,我需要能够替换其中的某些字符串。现在,我知道如果我想用我自己的相同长度的字符串替换字符串,我可以简单地更改字节。问题是,一些字符串可能比需要的短,我需要以某种方式无效终止。

如果这是C,我可以在添加我想要替换的字符串之后添加一个空字节,但在C#中,字符串中显然包含空字节,这将导致我的应用程序出现问题

你们中有人有解决方法吗?

谢谢

3 个答案:

答案 0 :(得分:1)

如果要修改已编译的程序,可以包含套接字。这样程序就可以获得修改字符串的请求。或者在命令行运行时接受命令行。但我猜你不想触摸已编译的程序。如果它是一个cstring,那么你的内存编辑就可以了(如果你知道位置的话)。

答案 1 :(得分:1)

字符串存储在C#编译代码中的方式与C ++的方式不同。我实际上没有看过这些位,但我相信字符串存储在可执行文件中的方式与它们存储在内存中的方式相同。这意味着某个地方有一组字节告诉系统字符串有多长,字符串实际上不是空终止。为了让你按照你认为需要找到这些字节并改变它们以反映长度的方式工作。

如果您有权访问代码,则可能需要更改代码,以便使用配置文件中的值而不是代码中存储的值。

答案 2 :(得分:1)

我认为你可以使用一些免费工具来做到这一点。一个是Telerik的JustDecompile,另一个是JustDecompile的插件,它允许您相当容易地编辑现有的程序集。插件是Reflixil。您可以使用JustDecompile中的插件配置功能下载并安装它。

要看它是否有效,我用一个简单的winform应用程序进行了一些测试。我拖动了exe文件,将其放到JustDecompile上,然后加载了exe程序集。然后,我单击插件菜单下的Reflexil以启用插件窗格。我点击了一个方法,该方法有一个我想要作为测试更改的文字字符串。

作为测试,我尝试将“秒”更改为“经过的秒数”,故意选择更长的字符串长度。在Reflexil窗格中,我找到了引用文字的IL代码:

右键单击该行,然后选择“编辑”。这让我只需输入一个不同的字符串。在编辑之后,这条线在Reflexil窗格中显示如下:

enter image description here

然后我转到左侧窗格,右键单击我的程序集,并从弹出菜单中选择Reflexil,然后从下面的菜单中选择Save and Reload。然后我运行了我的程序,并且低,看哪,我改变的文本出现在表单上:

所以,总而言之,这很简单,似乎让我完全按照你的要求去做,即直接在现有的C#/ .Net程序集中编辑字符串。