C# Dotfuscator不';你不支持Unity3d吗?
我用C#编写的一些DLL测试了Dotfuscator。 它似乎在.NET环境下运行得非常好,所以这次我用Unity3D试用了它们。那些简单的DLL只使用简单的标准C#类和方法编码,没有反射,没有LINQ,没有包括Unity在内的其他定制或第三方API。但在我的Unity3d项目中,它们无法正常工作,而原始的未模糊处理的纯DLL工作正常。 经过几个小时的努力,我决定用新的简单项目进行测试。下面是我在C#中得到的所有代码,没有其他代码,也没有其他参考C# Dotfuscator不';你不支持Unity3d吗?,c#,unity3d,mono,obfuscation,dotfuscator,C#,Unity3d,Mono,Obfuscation,Dotfuscator,我用C#编写的一些DLL测试了Dotfuscator。 它似乎在.NET环境下运行得非常好,所以这次我用Unity3D试用了它们。那些简单的DLL只使用简单的标准C#类和方法编码,没有反射,没有LINQ,没有包括Unity在内的其他定制或第三方API。但在我的Unity3d项目中,它们无法正常工作,而原始的未模糊处理的纯DLL工作正常。 经过几个小时的努力,我决定用新的简单项目进行测试。下面是我在C#中得到的所有代码,没有其他代码,也没有其他参考 [System.Reflection.Obfus
[System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)]
public class Class1
{
[System.Reflection.Obfuscation(Feature = "renaming", Exclude = true)]
public static int Get()
{
return 123;
}
}
在编译成DLL后,我把它放在Unity3D编辑器的一个空项目中并播放,效果很好。但当我在用Dotfuscator混淆DLL后再次尝试时,它不再说“invalidProgrammeException:Invalid-IL-code in-Class1:Get():IL_000c:pop”
正如您在上面看到的,我添加了一些属性来防止代码被重命名,当然,我可以在Reflector中看到,类和方法的名称实际上都没有被重命名
昨天,我在PreEmptive的网站上新注册并下载了最新的Dotfuscator专业版4.21.0的评估版。我使用.NET3.5在VisualStudio2008和2015上编译了这两个版本,并尝试了所有不同的解决方案平台。Unity的版本是5.3.4f1
我现在猜测Dotfuscator只适用于MSIL,而不是Unity3D内部使用的Mono 2.X
我说得对吗?是否有人将Dotfuscator与Unity3D或Mono well一起使用
[编辑]
我用ILDasm检查了IL代码,不知道发生了什么,但有趣的是看到一堆代码被修改了
在应用Dotfuscator之前
.method public hidebysig static int32 Get() cil managed
{
.custom instance void [mscorlib]System.Reflection.ObfuscationAttribute::.ctor() = ( 01 00 02 00 54 0E 07 46 65 61 74 75 72 65 08 72 // ....T..Feature.r
65 6E 61 6D 69 6E 67 54 02 07 45 78 63 6C 75 64 // enamingT..Exclud
65 01 ) // e.
// Code Size 6 (0x6)
.maxstack 8
IL_0000: ldc.i4 0x75bcd15
IL_0005: ret
} // end of method Class1::Get
.method public hidebysig static int32 Get() cil managed
{
// Code Size 127 (0x7f)
.maxstack 2
.locals init (int32 V_0)
IL_0000: ldc.i4 0x993
IL_0005: stloc V_0
IL_0009: ldloca V_0
IL_000d: ldind.i4
IL_000e: ldc.i4 0x993
IL_0013: stloc V_0
IL_0017: ldloca V_0
IL_001b: ldind.i4
IL_001c: ceq
IL_001e: switch (
IL_002f,
IL_004c,
IL_002f)
IL_002f: br.s IL_003e
IL_0031: ldc.i4.0
IL_0032: stloc V_0
IL_0036: ldloca V_0
IL_003a: ldind.i4
IL_003b: pop
IL_003c: br.s IL_004a
IL_003e: ldc.i4.0
IL_003f: stloc V_0
IL_0043: ldloca V_0
IL_0047: ldind.i4
IL_0048: br.s IL_003b
IL_004a: nop
IL_004b: nop
IL_004c: ldc.i4 0x1
IL_0051: stloc V_0
IL_0055: ldloca V_0
IL_0059: ldind.i4
IL_005a: br.s IL_0068
IL_005c: ldc.i4.0
IL_005d: stloc V_0
IL_0061: ldloca V_0
IL_0065: ldind.i4
IL_0066: br.s IL_0068
IL_0068: brfalse.s IL_006a
IL_006a: ldc.i4.0
IL_006b: stloc V_0
IL_006f: ldloca V_0
IL_0073: ldind.i4
IL_0074: brfalse IL_0079
IL_0079: ldc.i4 0x75bcd15
IL_007e: ret
} // end of method Class1::Get
应用Dotfuscator后
.method public hidebysig static int32 Get() cil managed
{
.custom instance void [mscorlib]System.Reflection.ObfuscationAttribute::.ctor() = ( 01 00 02 00 54 0E 07 46 65 61 74 75 72 65 08 72 // ....T..Feature.r
65 6E 61 6D 69 6E 67 54 02 07 45 78 63 6C 75 64 // enamingT..Exclud
65 01 ) // e.
// Code Size 6 (0x6)
.maxstack 8
IL_0000: ldc.i4 0x75bcd15
IL_0005: ret
} // end of method Class1::Get
.method public hidebysig static int32 Get() cil managed
{
// Code Size 127 (0x7f)
.maxstack 2
.locals init (int32 V_0)
IL_0000: ldc.i4 0x993
IL_0005: stloc V_0
IL_0009: ldloca V_0
IL_000d: ldind.i4
IL_000e: ldc.i4 0x993
IL_0013: stloc V_0
IL_0017: ldloca V_0
IL_001b: ldind.i4
IL_001c: ceq
IL_001e: switch (
IL_002f,
IL_004c,
IL_002f)
IL_002f: br.s IL_003e
IL_0031: ldc.i4.0
IL_0032: stloc V_0
IL_0036: ldloca V_0
IL_003a: ldind.i4
IL_003b: pop
IL_003c: br.s IL_004a
IL_003e: ldc.i4.0
IL_003f: stloc V_0
IL_0043: ldloca V_0
IL_0047: ldind.i4
IL_0048: br.s IL_003b
IL_004a: nop
IL_004b: nop
IL_004c: ldc.i4 0x1
IL_0051: stloc V_0
IL_0055: ldloca V_0
IL_0059: ldind.i4
IL_005a: br.s IL_0068
IL_005c: ldc.i4.0
IL_005d: stloc V_0
IL_0061: ldloca V_0
IL_0065: ldind.i4
IL_0066: br.s IL_0068
IL_0068: brfalse.s IL_006a
IL_006a: ldc.i4.0
IL_006b: stloc V_0
IL_006f: ldloca V_0
IL_0073: ldind.i4
IL_0074: brfalse IL_0079
IL_0079: ldc.i4 0x75bcd15
IL_007e: ret
} // end of method Class1::Get
更新:从6.0版开始,Dotfuscator Professional不再支持Unity。(见附件)。它继续支持Mono。最初的答案如下
是的,Dotfuscator专业版支持Mono和Unity。您在IL中看到差异的原因是由于Professional Edition提供的控制流混淆。这与您已从中排除标识符的重命名功能不同 默认情况下,Dotfuscator在.NET Framework(即Microsoft的实现)上使用尽可能多的控制流转换但是,其中一些转换与Mono不兼容。Dotfuscator提供了禁用此类转换的选项 在GUI中加载Dotfuscator项目后,可以在“设置”选项卡上的“高级”下找到此选项,名为“仅使用与Mono兼容的转换”。将此选项设置为“是”,然后保存并重建项目 如果这仍然给您带来问题,您可以完全禁用控制流,看看这是否解决了问题。这也在“设置”选项卡上的“功能”、“禁用控制流”下。将此选项设置为“是”,然后保存并重建项目
完全披露:我在PreEmptive Solutions的Dotfuscator团队工作。如果您还有更多问题,请记住,像您这样的评估用户也有权获得先发制人的支持。更新:从6.0版开始,Dotfuscator Professional不再支持Unity。(见附件)。它继续支持Mono。原题如下
是的,Dotfuscator专业版支持Mono和Unity。您在IL中看到差异的原因是由于Professional Edition提供的控制流混淆。这与您已从中排除标识符的重命名功能不同 默认情况下,Dotfuscator在.NET Framework(即Microsoft的实现)上使用尽可能多的控制流转换但是,其中一些转换与Mono不兼容。Dotfuscator提供了禁用此类转换的选项 在GUI中加载Dotfuscator项目后,可以在“设置”选项卡上的“高级”下找到此选项,名为“仅使用与Mono兼容的转换”。将此选项设置为“是”,然后保存并重建项目 如果这仍然给您带来问题,您可以完全禁用控制流,看看这是否解决了问题。这也在“设置”选项卡上的“功能”、“禁用控制流”下。将此选项设置为“是”,然后保存并重建项目
完全披露:我在PreEmptive Solutions的Dotfuscator团队工作。如果您还有更多问题,请记住,像您这样的评估用户也有权获得先发制人的支持。您是否尝试在MonoDevelop(与Unity一起)中创建新的Mono 2项目,并在那里测试DLL?如果有效,问题在于Unity如果无效,问题在于Unity使用的单声道和/或单声道版本。@JerrySwitalski谢谢。正如你所说,我认为这是值得尝试的,我会在回家后检查:)顺便说一句,Mono 2.X版本现在可以使用了吗?Unity使用旧版本的Mono,所以如果没有,可能会有所不同。您是否尝试在MonoDevelop(与Unity一起)中创建新的Mono 2项目,并在那里测试DLL?如果有效,问题在于Unity如果无效,问题在于Unity使用的单声道和/或单声道版本。@JerrySwitalski谢谢。正如你所说,我认为这是值得尝试的,我会在回家后检查:)顺便说一句,Mono 2.X版本现在可以使用了吗?Unity使用的是旧版本的Mono,所以如果不是的话可能会有所不同。我在这里问过之后,问过先发制人的支持团队。我不得不在那里添加这个stackoverflow链接,因为在网站上的一个小盒子里写和引用上面的所有代码有点困难。令我失望的是,他/她甚至没有检查我要看的这一页。此外,他/她只写了四句简短的话,只是说他/她不确定为什么我不能让它工作,因为它应该支持Unity3d。但是安瓦