在下面的 YSOD 中,堆栈跟踪(和源文件行)包含源文件的完整路径。不幸的是,源文件名的完整路径包含我的用户名,即firstname.lastname
.
我想保留 YSOD 以及堆栈跟踪,包括文件名和行号(这是一个演示和测试系统),但用户名应该从源文件路径中消失。看文件的路径也是可以的,但是路径要在解决方案根目录下截断。
(在发布之前,我不必每次都将解决方案复制粘贴到另一条路径......)
有没有办法做到这一点?
注意:自定义错误页面不是一个选项。
在下面的 YSOD 中,堆栈跟踪(和源文件行)包含源文件的完整路径。不幸的是,源文件名的完整路径包含我的用户名,即firstname.lastname
.
我想保留 YSOD 以及堆栈跟踪,包括文件名和行号(这是一个演示和测试系统),但用户名应该从源文件路径中消失。看文件的路径也是可以的,但是路径要在解决方案根目录下截断。
(在发布之前,我不必每次都将解决方案复制粘贴到另一条路径......)
有没有办法做到这一点?
注意:自定义错误页面不是一个选项。
路径嵌入在.pdb
编译器生成的文件中。改变这一点的唯一方法是在其他位置构建您的项目,最好是在构建服务器附近的某个地方。
没关系,我自己发现的。
感谢 Anton Gogolev 声明路径在 pdb 文件中,我意识到这是可能的。
可以对 pdb 文件进行二进制搜索和替换,然后将用户名替换为其他内容。
我很快尝试使用这个:
https
://codereview.stackexchange.com/questions/3226/replace-sequence-of-strings-in-binary-file
并且它有效(在 50% 的 pdb 文件上)。所以请注意废话,链接中的代码片段似乎有问题。
但这个概念似乎奏效了。
我现在使用这段代码:
public static void SizeUnsafeReplaceTextInFile(string strPath, string strTextToSearch, string strTextToReplace)
{
byte[] baBuffer = System.IO.File.ReadAllBytes(strPath);
List<int> lsReplacePositions = new List<int>();
System.Text.Encoding enc = System.Text.Encoding.UTF8;
byte[] baSearchBytes = enc.GetBytes(strTextToSearch);
byte[] baReplaceBytes = enc.GetBytes(strTextToReplace);
var matches = SearchBytePattern(baSearchBytes, baBuffer, ref lsReplacePositions);
if (matches != 0)
{
foreach (var iReplacePosition in lsReplacePositions)
{
for (int i = 0; i < baReplaceBytes.Length; ++i)
{
baBuffer[iReplacePosition + i] = baReplaceBytes[i];
} // Next i
} // Next iReplacePosition
} // End if (matches != 0)
System.IO.File.WriteAllBytes(strPath, baBuffer);
Array.Clear(baBuffer, 0, baBuffer.Length);
Array.Clear(baSearchBytes, 0, baSearchBytes.Length);
Array.Clear(baReplaceBytes, 0, baReplaceBytes.Length);
baBuffer = null;
baSearchBytes = null;
baReplaceBytes = null;
} // End Sub ReplaceTextInFile
替换firstname.lastname
为具有相同数量字符的内容,例如“Poltergeist”。
现在我只需要弄清楚如何运行二进制搜索并将替换作为构建后操作。