我用一些用C#編寫的DLL測試了Dotfuscator。 它似乎在.NET環境下效果很好,所以這次我用Unity3D試了一下。這些簡單的DLL只是用簡單的標準C#類和方法進行編碼,沒有反射,沒有LINQ,沒有其他自定義或第三方API(包括Unity的)。但未能讓他們在我的Unity3d項目中工作,而未被模糊處理的原始純DLL工作正常。 經過幾個小時的掙扎後,我決定用新的簡單項目進行測試。下面是我在C#中獲得的所有內容,沒有其他代碼,根本沒有其他參考。Dotfuscator不支持Unity3d?
[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 Editor的EMPTY項目中並播放,效果很好。但是,當我用Dotfuscator混淆DLL後再次嘗試時,它停止說「InvalidProgramException:Class1中的IL代碼無效:Get():IL_000c:pop」。
正如您在上面看到的,我添加了防止代碼被重命名的屬性,當然,我可以在Reflector中看到類和方法的名稱實際上未被重命名。
昨天我新註冊並從PreEmptive網站下載了最新的Dotfuscator專業版4.21.0評估版。我使用.NET 3.5編譯了Visual Studio 2008和2015,並嘗試了所有不同的解決方案平臺。 Unity的版本是5.3.4f1。
我現在的猜測是Dotfuscator只適用於MSIL,而不是Unity3D內部使用的Mono 2.X。
我對不對?有沒有人在Unity3D或Mono中使用Dotfuscator?
[編輯] 我使用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
應用Dotfuscator的
.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
你有沒有嘗試在MonoDevelop(與Unity合作)中創建新的Mono 2項目,並測試你的DLL?如果它能工作,問題在於Unity,如果不是的話,問題在於Mono和/或Mono版本統一使用。 –
@JerrySwitalski謝謝。正如你所說,我認爲這是值得嘗試的,當我回到家時會檢查它:)順便說一下,單聲道2.X版本現在可用? Unity使用老版本的Mono,所以如果不是這樣的話,它可能會有所不同。 – Jenix