C# Dotfuscator不';你不支持Unity3d吗?

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

我用C#编写的一些DLL测试了Dotfuscator。 它似乎在.NET环境下运行得非常好,所以这次我用Unity3D试用了它们。那些简单的DLL只使用简单的标准C#类和方法编码,没有反射,没有LINQ,没有包括Unity在内的其他定制或第三方API。但在我的Unity3d项目中,它们无法正常工作,而原始的未模糊处理的纯DLL工作正常。 经过几个小时的努力,我决定用新的简单项目进行测试。下面是我在C#中得到的所有代码,没有其他代码,也没有其他参考

[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。但是安瓦