2

リリース ビルド用 (Mono を使用しないマシンでのベータ テスト用) に "Link SDK のみ" を使用してアプリをビルドすると、アプリが起動しなくなり、すぐにクラッシュするようです。

アプリのコマンド ラインを実行した場合のクラッシュは次のとおりです。

[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: An exception was thrown by the type initializer for System.Xml.Serialization.XmlSerializer ---> System.Configuration.ConfigurationErrorsException: Error Initializing the configuration system. ---> System.MissingMethodException: Default constructor not found for type System.Configuration.ExeConfigurationHost.
  at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000] in <filename unknown>:0 
  at System.Activator.CreateInstance (System.Type type) [0x00000] in <filename unknown>:0 
  at System.Configuration.InternalConfigurationSystem.Init (System.Type typeConfigHost, System.Object[] hostInitParams) [0x00000] in <filename unknown>:0 
  at System.Configuration.InternalConfigurationFactory.Create (System.Type typeConfigHost, System.Object[] hostInitConfigurationParams) [0x00000] in <filename unknown>:0 
  at System.Configuration.ConfigurationManager.OpenExeConfigurationInternal (ConfigurationUserLevel userLevel, System.Reflection.Assembly calling_assembly, System.String exePath) [0x00000] in <filename unknown>:0 
  at System.Configuration.ClientConfigurationSystem.get_Configuration () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Configuration.ClientConfigurationSystem.get_Configuration () [0x00000] in <filename unknown>:0 
  at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection (System.String configKey) [0x00000] in <filename unknown>:0 
  at System.Configuration.ConfigurationManager.GetSection (System.String sectionName) [0x00000] in <filename unknown>:0 
  at System.Configuration.ConfigurationSettings.GetConfig (System.String sectionName) [0x00000] in <filename unknown>:0 
  at System.Xml.Serialization.XmlSerializer..cctor () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---

ここに適切な[Preserve]属性を追加する方法はありますか? または、リンカにこのクラスを保持させますか?

いくつかの詳細情報:

  • 私のアプリはDraw a Stickman: EPICと呼ばれるモノゲーム ゲームです。
  • アセンブリをリンクしなくても問題なく動作しますが、アプリは 10 MB 大きくなります
  • もともと、Tao.Sdl.dll のリンカからいくつかのエラーが発生していましたが、メイン プロジェクトでそれを参照したところ、修正されました。
  • 10.6以降をターゲットにしています
4

3 に答える 3

4

MMP (MonoMac Packer) と MonoTouch の の主な違いmtouchは、MonoMac が完全な .NET フレームワークを使用することです。これにより、アプリケーションのリンクがより複雑になります。

なんで ?主にSystem.Configuration(これはアセンブリですが、他のいくつかのアセンブリの名前空間でもあります)。リフレクションと.configファイルを使用して自分自身をセットアップします。また、リンカーは (実行ごとに変更される可能性があるため) アプリケーションに何が必要かを正確に知ることができません。

MMPは、最も一般的なケース (System.Net など) をカバーしようとしますが、現在、BCL 内で System.Configuration が使用されているすべてのケースを処理できるわけではありません。

これを修正するには...アプリケーションが実行時に必要とするすべてのものを含めるようにリンカーに指示する必要があります例えば

[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: 
An exception was thrown by the type initializer for System.Xml.Serialization.XmlSerializer 
---> System.Configuration.ConfigurationErrorsException: Error Initializing the configuration system. 
---> System.MissingMethodException: Default constructor not found for type System.Configuration.ExeConfigurationHost.

これは、アプリケーションが (間接的であっても) を使用してSystem.Configuration.ExeConfigurationHostおり、リンカーがそれを検出できなかったことを意味します (リフレクションを介して使用されます)。

そこからXML ファイルを作成して、リンカにこれらの必要なタイプを教える必要があります (他にも多くのタイプがある可能性があります)。その XML ファイルは MMP (--xml=FILE) にフィードバックされるため、リンカーはリンクされたアプリケーションからそれらの型/メソッドを削除しようとしません。

代替案は、一部のアセンブリをリンクしていない--linkskip=Systemか、リンクしていません (例: )。YMMV。

更新: MonoMac のスーパーセットである新しいXamarin.Macには、この例外を解決するリンカーの拡張バージョンが含まれています (ただし、他のすべてのものではない可能性があります。バグ レポートを記入してください)。

于 2012-12-10T16:45:50.900 に答える
1

これは、mmp(MonoDevelopに組み込まれているMonoMacパッケージャー)がフレームワークから削除しすぎるために発生します。特にXMLを使用する場合。

XMLを機能させるには、これらの追加の引数をmmpに渡す必要があることがわかりました。

--linkskip=System.Net --linkskip=System --linkskip=System.Configuration --linkskip=mscorlib

残念ながら、monodevelopのプロジェクト構成のmmp引数は機能しません(保存しないでください)。私はこれらのバグを報告して修正しましたが、何らかの理由で後のバージョンまで利用できるようにはならないようです。

今のところ、コマンドラインからmmpを実行できます。ビルド出力には現在のコマンドが表示されるため、それを使用できますが、上記の引数を追加してください。

これを行うことはまだかなりの価値があります。それらのライブラリをリンクしなくても、私のアプリは20MBから10MBになりました。

于 2012-12-10T16:49:44.587 に答える
1

いくつかのアイデア:

  • コンソールアプリに何か印刷されていますか?
  • ターミナルからMyApp.app/Contents/MacOS/(binary)を実行してみてください。これにより、少なくともターミナルに何かが出力されます。
于 2012-12-10T14:10:14.013 に答える