52130


Visual StudioでXamarin.iOSを利用したライブラリを作成しました。

[code]

    using JavaScriptCore;
    using Foundation;
    
    namespace JSCore
    {
        public static class MyClass
        {
            public static int Test()
            {
                JSContext jsContext = new JSContext();
                jsContext[new NSString("arg1")] = JSValue.From(2, jsContext);
                jsContext[new NSString("arg2")] = JSValue.From(2, jsContext);
    
                var jsResult = jsContext.EvaluateScript("arg1 + arg2;");
    
                return jsResult.ToInt32();
            }
        }
    }
    
[/code]

ビルドで出来た`JSCore.dll`と`Xamarin.iOS.dll`をUnityのPluginsフォルダに入れてC#スクリプトの方で呼び出しを行いました。

しかし、UnityでアプリをビルドするとConverting Managed assemblies to
C++の段階でエラーが起きてビルド失敗します。エラー文は以下の通りです。

[code]

    IL2CPP error for method 'System.Void ObjCRuntime.Runtime::set_UseAutoreleasePoolInThreadPool(System.Boolean)' in assembly '/Users/ユーザ名/Documents/JavaScriptRuntimeTest/Temp/StagingArea/Data/Managed/Xamarin.iOS.dll'
    Additional information: Build a development build for more information. Object reference not set to an instance of an object.
    
[/code]

エラー文を読んでみて恐らくライブラリが参照している`System.dll`とUnity側で利用しようとしている`System.dll`が違うのかなと思い、ライブラリをビルドする時の出力に参照している`System.dll`を含ませてそれをそのままUnityに入れてみました。

案の定、バージョンが衝突を起こしているという旨のエラーが出たので、プラットフォームの選択でiOSを選ぶことでエラーは消せたのですが、またしてもビルド時に同様のエラーが起きてしまいます。

`error CS1703: Multiple assemblies with equivalent identity have been
imported`

Xamarin.iOSで利用できる`System.dll`が2.0.5.0で、Unity(Mono)が利用しているのが4.0.0.0なのは分かっています。

このエラーを回避する方法を知りたいです。

追記(2019/0.1/20): Unityは2018.3.0f2を使用。また、PlayerSettingsのAPI Compatibility
Levelは.NET Standard 2.0に設定してあります。


CC BY-SA 4.0
2019-01-17T03:45:44.703
52047
2019-03-05T10:44:57.230
2019-01-20T06:22:22.867
31396
31396
question
c# unity3d xamarin
Xamarin.iOSを用いたライブラリがUnityで使えない


> Xamarin.iOSで利用できるSystem.dllが2.0.5.0で、Unity(Mono)が利用しているのが4.0.0.0なのは分かっています。

おそらく、Xamarin.iOS のは、.NET Standard 2.0 の dll で、Unity(Mono) のは、.NET Framework
4.x のものだと思われます。

Unityの 2018.3(2018.1?) から .NET Standard 2.0
が選べるようになっているはずなので、そちらを使って、版数を合わせるとかした方が良いのでは？

[Unity 2018.3](https://unity3d.com/jp/unity/whats-
new/unity-2018.3.0?_ga=2.77487637.1436182513.1547951758-1488261442.1546767691)

> Editor: When Unity builds assemblies in the Editor for the .NET 4.x
> scripting runtime, they now have .NET 4.6 (NET_4_6 define) set, regardless
> of when the .NET Standard 2.0 scripting profile is set (NET_STANDARD_2_0
> define). This is because the scripting profile setting only affects players,
> and the Editor always uses the .NET 4.6 scripting profile.
>
> Scripting Upgrade: Updated the default Api Compatibility Level to .NET
> Standard 2.0.

[Unity 2018.1
で新しくなるスクリプティングランタイムと今後の予定](https://blogs.unity3d.com/jp/2018/03/28/updated-
scripting-runtime-in-unity-2018-1-what-does-the-future-hold/)

> どの .NET プロファイルを使用すべきか  
>  安定版のスクリプティングランタイムには 2 つの新しい .NET プロファイルが含まれています。.NET プロファイルは、コードが .NET
> クラスライブラリに使用できる API サーフェスを定義します。お使いのプレイヤービルド用の .NET プロファイルの選択は、Player
> Settings（プレイヤー設定）の「Api Compatibility Level」のオプションで行えます。Unity は以下の 2 つの .NET
> プロファイルに対応しています。
>
> .NET Standard 2.0  
>  .NET 4.x
>
> .NET Standard 2.0 プロファイルは、.NET Foundation によって公開された同じ名前のプロファイルと同一のものです。新しい
> Unity プロジェクト用には是非このプロファイルを選択してください。.NET 4.x
> より小さいので、モバイル端末など、サイズに制約の掛かるプラットフォームに適しています。また、このプロファイルは、Unity
> が対応しているすべてのプラットフォームで機能するようになります。Unity
> で使用されるライブラリの開発者の方は、このプロファイルをターゲットにすることをお奨めします。

クロスプラットフォームなプロジェクトの作り方は、こちらに解説があります。  
この関係で色々な資料があるので、リンクやトピックを追ってみてください。  
[共有コードの概要](https://docs.microsoft.com/ja-jp/xamarin/cross-platform/app-
fundamentals/code-sharing)

> クロスプラット フォーム対応のアプリケーション間でコードを共有するための 3 つの方法はあります。
>
> .NET standard ライブラリ – .NET Standard
> プロジェクトを複数のプラットフォームで共有できるコードを実装することができ、(バージョン) によって多数の .NET Api にアクセスできます。
> .NET standard 1.0 ~ 1.6 は、.NET Standard 2.0 (Xamarin アプリで利用できる .NET Api を含む)
> は .NET BCL の最適なカバレッジを提供しますが、Api のセットを徐々 に大きくなるを実装します。
>
> 共有プロジェクト – 共有アセット プロジェクトの種類を使用して、ソース コードを整理し、使用#ifコンパイラ
> ディレクティブのプラットフォームに固有の要件を管理するために必要とします。
>
> ポータブル クラス ライブラリ (非推奨)-ポータブル クラス ライブラリ (Pcl) ことができます、共通 API
> サーフェイスで複数のプラットフォームをターゲットし、プラットフォーム固有の機能を提供するインターフェイスを使用します。 最新バージョンの Visual
> Studio での Pcl は非推奨–代わりに .NET Standard を使用します。

* * *

**追記**  
こんなのを見つけました。もしかしたら関係しているかもしれませんね。

[Xamarin.iOSでCS1703:Multiple assemblies with equivalent identity have been
imported](https://spacekey.info/2165/)

上記の参照先がこちら。  
[How to resolve compilation issue CS1703 error in a Xamarin.iOS
project](https://www.spacelinx.com/2018/02/06/how-to-resolve-compilation-
issue-cs1703-error-in-a-xamarin-ios-project/)  
メインの記事は同じ内容のようですが、上記記事を書く基になったQ&Aかもしれません。  
[Xamarin.iOS project: CS1703: Multiple assemblies with equivalent identity
have been imported](https://forums.xamarin.com/discussion/120814/xamarin-ios-
project-cs1703-multiple-assemblies-with-equivalent-identity-have-been-
imported)


CC BY-SA 4.0
2019-01-20T03:33:06.297
52130
2019-01-21T07:01:52.347
2019-01-21T07:01:52.347
26370
26370
52047
answer