修改.Net源码的方法再记录和安全签名限制
2025-10-30 13:53:49
标签: svg sharpvectors ildasm ilspy hittest
Git
Hub上的ElinamLLC/SharpVectors/tree/master
是一个.Net上显示Svg文件的神库,想借用一下,于是,尝试了一下项目生成的依赖关系图。
发现选中有问题。
选择绿框中的图形不工作
SharpVectors-master\Source\SharpVectorRenderingWpf\Wpf\WpfDrawingDocument.cs
if (TryCast.Cast(geometry, out path))
{
if (path.FillContains(pt,
1, ToleranceType.Absolute))
{
return true;
}
}
上面return true需要改成return false
这里的问题是,弧线的bounding
box包括了里面的椭圆,造成选不中里面的。改成false后,要求完全hit线的时候才可以选中。
在VDI中,我用的是下载的package包,有签名,尝试了用ildasm弄出il,再重新编译回去的方法不工作,会报签名错误。
签名错误
而通过直接修改17成16的方法,则没有这个问题。
在ildasm中,选中显示字节能看出来二进制字节码,直接在文件中查找(VS就行,改后缀为lib,能二进制打开)
IL_003a: call
bool
[SharpVectors.Core]SharpVectors.TryCast::Cast(!!0,
!!1&)
IL_003f: brfalse.s
IL_0057
IL_0041: ldloc.s
V_6
IL_0043: ldarg.2
IL_0044: ldc.r8
1.
IL_004d: ldc.i4.0
IL_004e: callvirt instance
bool
[PresentationCore]System.Windows.Media.Geometry::FillContains(valuetype
[WindowsBase]System.Windows.Point,
float64,
valuetype
[PresentationCore]System.Windows.Media.ToleranceType)
IL_0053: brfalse.s
IL_00bb
IL_0055: ldc.i4.1
IL_0056: ret
直接查找 28 0A 00 00 2B 2C 16 11 06 04 23 00 00 00 00 00 00 F0 3F 16
6F ED 00 00 0A 2C 66 17 2A
修改二进制码
把17改成16就相当于return false
再次尝试运行,就可以了,安全签名的检查也不报错了。
新的选中效果
放进自己源码后
修改.Net源码的方法再记录和安全签名限制
Git Hub上的ElinamLLC/SharpVectors/tree/master
是一个.Net上显示Svg文件的神库,想借用一下,于是,尝试了一下项目生成的依赖关系图。
发现选中有问题。
SharpVectors-master\Source\SharpVectorRenderingWpf\Wpf\WpfDrawingDocument.cs
if (TryCast.Cast(geometry, out path))
{
if (path.FillContains(pt, 1, ToleranceType.Absolute))
{
return true;
}
}
上面return true需要改成return false
这里的问题是,弧线的bounding box包括了里面的椭圆,造成选不中里面的。改成false后,要求完全hit线的时候才可以选中。
在VDI中,我用的是下载的package包,有签名,尝试了用ildasm弄出il,再重新编译回去的方法不工作,会报签名错误。
而通过直接修改17成16的方法,则没有这个问题。
在ildasm中,选中显示字节能看出来二进制字节码,直接在文件中查找(VS就行,改后缀为lib,能二进制打开)
IL_003a: call bool [SharpVectors.Core]SharpVectors.TryCast::Cast(!!0,
!!1&)
IL_003f: brfalse.s IL_0057
IL_0041: ldloc.s V_6
IL_0043: ldarg.2
IL_0044: ldc.r8 1.
IL_004d: ldc.i4.0
IL_004e: callvirt instance bool [PresentationCore]System.Windows.Media.Geometry::FillContains(valuetype [WindowsBase]System.Windows.Point,
float64,
valuetype [PresentationCore]System.Windows.Media.ToleranceType)
IL_0053: brfalse.s IL_00bb
IL_0055: ldc.i4.1
IL_0056: ret
直接查找 28 0A 00 00 2B 2C 16 11 06 04 23 00 00 00 00 00 00 F0 3F 16 6F ED 00 00 0A 2C 66 17 2A
把17改成16就相当于return false
再次尝试运行,就可以了,安全签名的检查也不报错了。