没有加载名为AppDelegate的类

时间:2017-11-20 22:24:26

标签: xamarin xamarin.ios

我们有一个Xamarin.iOS项目,它与一个经过重构的WPF项目共享一个代码后端。所有共享代码库都已转换为.net标准。

Xamarin项目构建,但模拟器在启动时抛出异常:

  

已抛出Foundation.MonoTouchException

     

抛出Objective-C异常。名称:NSInternalInconsistencyException原因:无法实例化UIApplication委托实例。没有加载名为AppDelegate的类。

出于测试目的,我向Main.cs添加了一个空的UIApplicationDelegate,我仍然得到异常(现在仅指TestDelegate)。

Main.cs

using Foundation;
using UIKit;

namespace App.IOS
{
    public class Application
    {
        static void Main (string[] args)
        {
            UIApplication.Main (args, null, nameof(AppDelegate));
        }
    }
}

Appdelegate.cs(非常大的文件,所以这里只是声明)。

namespace App.IOS
{
    public class MiniSetup
    {
        public static readonly MiniSetup Instance = new MiniSetup ();
        public void EnsureInit()
        {
            //Setting up Binding and Dependency Injection Here.
        }
    }


    [Register (nameof(AppDelegate))]
    public partial class AppDelegate : UIApplicationDelegate
    {
        public override bool FinishedLaunching (UIApplication app, NSDictionary options)
        {
            //Invoke Minisetup here
        }
        public override void WillEnterForeground (UIApplication application)
        {
            //snip
        }
        public override void DidEnterBackground (UIApplication 

application)
            {
                //snip
            }

// snip other code for setting UI controls and other app logic.
        }

很明显,我已经以某种方式搞砸了项目,但我还没有找到任何寻找解决方案的线索。关于如何排除故障的任何想法?

6 个答案:

答案 0 :(得分:3)

需要两个分类,UIApplicationDelegate子类和定义调用Main的{​​{1}}入口点的类将UIApplication.MainXamarin.iOS上使用的注册名称1}}子类。

基本/最小UIApplicationDelegate:

UIApplicationDelegate

基本/最低主要入口点:

[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
    public override UIWindow Window
    {
        get;
        set;
    }

}

答案 1 :(得分:1)

我这里没有吸烟枪,但在我能够弄清楚的时候,IOS项目中添加了一个不兼容的(带有xamarin)参考或nuget包。虽然本机代码抛出了本机程序集,但我想象AppDelegate实际上是在抛出NotSupportedException或AssemblyLoader Exception或类似的东西。

因此删除所有引用和nuget包,然后重新添加最低限度似乎已解决此问题。

答案 2 :(得分:0)

重建您的解决方案,然后重新启动IDE。

答案 3 :(得分:0)

在您发布的代码中,没有什么是突出的问题。 但是,您可以尝试以下方法:

  1. AppDelegate代码缺少'Window'属性。如果你还没有在问题中将它添加到你的代码片段中以便简洁,那很好。如果没有,请将其添加到您的应用代表。 XamarinApple都在ApDelegate和Storyboards的文档中提到了这一点。
  2. public override UIWindow Window { get; set; }

    1. 确保AppDelegate的Build action设置为Compile,并且不会错误地更改为none或任何其他值。这是不太可能的,但是因为你提到你正在经历一个巨大的重构,这可能会被意外改变。

    2. 类似problems之前有reported个不同的Xamarin.iOS版本。因此,尝试使用不同的xamarin版本设置运行项目。

    3. 虽然,我认为,在发布问题之前你已多次尝试过这个问题,我提到:尝试彻底清理和重建。 (手动删除iOS项目文件夹中的bin' and obj`文件夹,清理垃圾箱,然后进行重建以确保。另外,尝试完整的机器重启,请记住您正在使用Microsoft产品! )

    4. 我在相同的Xamarin文档中也发现了这个奇怪的行,虽然我不确定如何检查它,因为故事板没有所有者/ AppDelegate引用。

      < / LI>
        

      从XIB或故事板启动的应用程序使用   UIApplicationDelegate在XIB或故事板中指定。

      希望这些步骤中的任何一个都能帮到你。祝你好运。

答案 4 :(得分:0)

AppDelegate.cs的Build Action属性设置为Compile。

答案 5 :(得分:0)

对我来说,beforeSend : function () { $('.allVehicle').next().html('Please wait...'); }, success : function ( result ) { $('.allVehicle').next().html(result); //$('.allVehicle').next().text(result); if not workout as html then test it by passing text in it. } 项目中缺少一些参考资料。 确保05-27 13:54:22.584 32610-32610/com.example.andre.nutridian E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.andre.nutridian, PID: 32610 java.lang.RuntimeException: Unable to resume activity {com.example.andre.nutridian/com.example.andre.nutridian.Main2Activity}: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v7.widget.ActionBarContainer at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3353) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3384) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2574) at android.app.ActivityThread.access$900(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:168) at android.app.ActivityThread.main(ActivityThread.java:5885) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) Caused by: java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v7.widget.ActionBarContainer at android.support.v7.app.WindowDecorActionBar.init(WindowDecorActionBar.java:201) at android.support.v7.app.WindowDecorActionBar.<init>(WindowDecorActionBar.java:172) at android.support.v7.app.AppCompatDelegateImplV9.initWindowDecorActionBar(AppCompatDelegateImplV9.java:182) at android.support.v7.app.AppCompatDelegateImplBase.getSupportActionBar(AppCompatDelegateImplBase.java:145) at android.support.v7.app.AppCompatDelegateImplV9.onPostResume(AppCompatDelegateImplV9.java:267) at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:172) at android.app.Activity.performResume(Activity.java:6362) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3336) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3384)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2574)  at android.app.ActivityThread.access$900(ActivityThread.java:150)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:168)  at android.app.ActivityThread.main(ActivityThread.java:5885)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) public class DbHelper extends SQLiteOpenHelper { private static String DB_PATH=""; private static String DB_NAME="test.db"; private SQLiteDatabase mDataBase; private Context mContext=null; public DbHelper(Context context) { super(context, DB_NAME, null, 1); if(Build.VERSION.SDK_INT>=16) DB_PATH=context.getApplicationInfo().dataDir+"/databases/"; else DB_PATH="/data/data/"+context.getPackageName()+"/databases/"; mContext=context; } @Override public synchronized void close() { if(mDataBase!=null) mDataBase.close(); super.close(); } private boolean checkDataBase() { SQLiteDatabase tempDB = null; try { String path = DB_PATH + DB_NAME; tempDB = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE); }catch(Exception ex){} if(tempDB!=null) tempDB.close(); return tempDB!=null?true:false; } public void copyDataBase() { try { InputStream myInput = mContext.getAssets().open(DB_NAME); String outputFileName=DB_PATH+DB_NAME; OutputStream myOutput=new FileOutputStream(outputFileName); byte [] buffer=new byte[1024]; int length; while((length=myInput.read(buffer))>0){ myOutput.write(buffer,0,length); } myOutput.flush(); myOutput.close(); myInput.close(); } catch (IOException e) { e.printStackTrace(); } } public void openDataBase(){ String path=DB_PATH+DB_NAME; mDataBase=SQLiteDatabase.openDatabase(path,null,SQLiteDatabase.OPEN_READWRITE); } public void createDataBase(){ boolean isDBExist=checkDataBase(); if(isDBExist) { } else{ this.getReadableDatabase(); try{ copyDataBase(); }catch(Exception ex){} } } public List<Aliment> getAllAlim(){ List<Aliment> temp=new ArrayList<Aliment>(); SQLiteDatabase db= this.getWritableDatabase(); Cursor c; try { c = db.rawQuery("SELECT * FROM Aliment", null); if (c == null) return null; c.moveToFirst(); do { Aliment aliment = new Aliment(c.getString(c.getColumnIndex("aliment")), c.getString(c.getColumnIndex("calorii")), c.getString(c.getColumnIndex("cantitate"))); temp.add(aliment); } while (c.moveToNext()); c.close(); } catch(Exception e) { } db.close(); return temp; } @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }项目至少引用相同的包。