如何在Visual Studio中使用dot42创建类?

时间:2013-09-11 21:41:09

标签: android dot42

我刚刚发现了dot42,一种用于开发原生Android应用程序的C#方式。

所以我的第一个项目方式是使用一些旧代码来生成CRC8字节。我在项目中创建了一个新类,复制了代码并尝试正常使用它。

我继续获得java.lang.VerifyError ??

我的班级是简单的数学计算。当我将其作为公共方法分解为主要活动时,它按预期工作。

enter image description here

但是,如果我尝试使用静态类,我会收到该错误,而我不知道如何追踪问题是什么?我尝试添加各种android命名空间,尝试将其设置为普通类来实例化,甚至将其更改为internal

方法CRC8.Compute("mystring")甚至没有进入计算代码(如果我在那里放置一个断点)它只是在MainActivity.cs

中的方法上抛出错误

使用dot42如何使用这样的类? (我查看了网站上的各种示例,我无法指出需要做的具体事情)

namespace dot42Application1
{
    public class CRC8
    {
        static byte[] table = new byte[256];
        // x8 + x2 + x + 1 
        const byte poly = 0x07;

        public static string Compute(string ASCI)
        {
            int crcByte = Convert.ToInt16(ComputeChecksum(System.Text.Encoding.ASCII.GetBytes(ASCI)).ToString());
            return crcByte.ToString("000");
        }


        public static byte ComputeChecksum(byte[] bytes)
        {
            byte CRCInitialValue = 0xFF;
            //Final XOR value 0x00;
            //Not revered bytes
            //Not reverse CRC berfore final byte

            if (bytes != null && bytes.Length > 0)
            {
                foreach (byte b in bytes)
                {
                    CRCInitialValue = table[CRCInitialValue ^ b];
                }
            }
            return CRCInitialValue;
        }

        public CRC8()
        {
            for (int i = 0; i < 256; ++i)
            {
                int temp = i;
                for (int j = 0; j < 8; ++j)
                {
                    if ((temp & 0x80) != 0)
                    {
                        temp = (temp << 1) ^ poly;
                    }
                    else
                    {
                        temp <<= 1;
                    }
                }
                table[i] = (byte)temp;
            }
        }




    }
}

也许这有帮助。堆栈跟踪显示......

enter image description here

2 个答案:

答案 0 :(得分:2)

这确实是dot42编译器中的一个错误,行:

int crcByte = Convert.ToInt16(...)内部结束为short,比调用int上的ToString为16位,传递16位值,而不将其向上转换为32位,从而导致验证错误。

我们(dot42编译器团队)为此问题创建了一个案例/票证。

作为解决方法,您可以将代码更改为: int crcByte = Convert.ToInt32(...)

希望这有帮助。

答案 1 :(得分:1)

检查一些可能的问题:

  1. 静态构造函数必须是无参数的。
  2. Memeber名称不能与其封闭类型相同。
  3. 属性:最佳设置Android API 8或更高版本。
  4. 你使用什么IDE--也许这是问题所在? (推荐VS2010)
  5. 您是否安装了最新的dot42,以及所有必要的许可证和安全密钥?
  6. 我在Win7操作系统上安装了VS2010和最新的dot42插件,并试图模拟你的类,希望看到相同的错误,但是一切都编译得很好。模拟的静态类放在同一名称空间中的另一个文件中。我从其他类别调用静态方法 - MainActivity类。

    这是模拟类:

    using System;
    using Android.App;
    using Android.Os;
    using Android.Widget;
    using Dot42;
    //using Dot42.Manifest;
    
    namespace MyNamespace
    {
        public  class CRC8
        {
            static byte[] table = new byte[256];
            //x8 + x2 + x + 1
            const byte poly = 0x07;
    
            public static byte getCRC(byte[] _bytes)
            {      return _bytes[0];
            }
    
            public static byte getCRC(String str_bytes)
            {      return (byte) str_bytes.CharAt(0); 
            }
             static  CRC8()
            {
                //nothing happens so far
            }
        }
    }
    

    以下是MainActivity类中的调用:

    protected override void OnCreate(Bundle savedInstance)
            {
                base.OnCreate(savedInstance);
                SetContentView(R.Layouts.MainLayout);
    
                TextView text_view = (TextView)FindViewById(R.Ids.textView1);
    
                byte[] aa = { 125, 54, 67, 78, 89 };
                byte b_ret = 0;
    
                b_ret = CRC8.getCRC("Ala ma kota");
                text_view.Text += "CRC8.getCRC(String): " + b_ret.ToString() + "\n";
    
                b_ret = CRC8.getCRC(aa);
                text_view.Text += "CRC8.getCRC(byte[]): " + b_ret.ToString() + "\n";
    
                text_view.Text += "CRC8.getCRC(ASCII.GetBytes): ";
                text_view.Text += CRC8.getCRC(System.Text.Encoding.ASCII.GetBytes("ABC123XYZ")).ToString() + "\n";
            }
    

    这是输出(API 18,即Android 4.3):

    • CRC8.getCRC(String):65
    • CRC8.getCRC(byte []):125
    • CRC8.getCRC(ASCII.GetBytes):65

    您能发现我们的代码之间有什么区别吗? 我希望这会有所帮助。