我们有一个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.
}
很明显,我已经以某种方式搞砸了项目,但我还没有找到任何寻找解决方案的线索。关于如何排除故障的任何想法?
答案 0 :(得分:3)
需要两个分类,UIApplicationDelegate
子类和定义调用Main
的{{1}}入口点的类将UIApplication.Main
在Xamarin.iOS
上使用的注册名称1}}子类。
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)
在您发布的代码中,没有什么是突出的问题。 但是,您可以尝试以下方法:
public override UIWindow Window { get; set; }
确保AppDelegate的Build action
设置为Compile
,并且不会错误地更改为none
或任何其他值。这是不太可能的,但是因为你提到你正在经历一个巨大的重构,这可能会被意外改变。
类似problems之前有reported个不同的Xamarin.iOS版本。因此,尝试使用不同的xamarin版本设置运行项目。
虽然,我认为,在发布问题之前你已多次尝试过这个问题,我提到:尝试彻底清理和重建。 (手动删除iOS项目文件夹中的bin' and
obj`文件夹,清理垃圾箱,然后进行重建以确保。另外,尝试完整的机器重启,请记住您正在使用Microsoft产品! )
我在相同的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) {
}
}
项目至少引用相同的包。