2017-08-03 7 views
0

Unityのネイティブプラグインを開発しようとしています(Unity 2017.1.0f3とVS 2015を使用しています)。私のネイティブプラグインのターゲットプラットフォームはUWPで、プラグインはC#で書かれています。C#で記述されたネイティブプラグインEntryPointNotFoundException

以下は、Unityのプラグインとスクリプトのコードです。クラス・ライブラリで

プラグインコード14393

public static class SettingsService 
    { 
     public static string GetSetting(string key) 
     { 
      var localSettings = ApplicationData.Current.LocalSettings; 
      try 
      { 
       var stringvalue = localSettings.Values[key] as string; 
       return stringvalue; 
      } 
      catch (ArgumentNullException en) 
      { 
       return default(string); 
      } 
     } 

     public static void SaveSetting(string key, string value) 
     { 
      var localSettings = ApplicationData.Current.LocalSettings; 
      localSettings.Values[key] = value; 
     } 
    } 

のWindows 10をターゲットユニティスクリプトコード

public class TestNativePlugin : MonoBehaviour { 

    [DllImport("UnityPluginTestUWP", EntryPoint = "GetSetting")] 
    private static extern string GetSetting(string key); 

    [DllImport("UnityPluginTestUWP", EntryPoint = "SaveSetting")] 
    private static extern void SaveSetting(string key, string value); 
    // Use this for initialization 
    void Start() {  
     SaveSetting("setting", "oeoeoe"); 
     System.Diagnostics.Debug.WriteLine(GetSetting("setting")); 
    }  
} 

問題は、実行時に、私はメッセージでEntryPointNotFoundExceptionを得ることです:見つけることが はできません。 DLL UnityPluginTestUWP.dll 'SaveSetting'という名前のエントリポイント

コンパイラによる関数名のマングリングのために、これが起こる可能性があることを私はオンラインで読んだ。しかし、これはC++のコードだけでした。私のプラグインはC#で書かれています。

これを克服する助けがあれば歓迎します。

+0

なぜDLLをインポートしたら、C++で記述されたのですか?あなたの資産フォルダにあなたのdllを直接組み込み、それを使ってください。 – joreldraw

答えて

1

質問には管理プラグインがあります。ネイティブC++プラグインをラップする別のC#プラグインを使用している場合は、DllImportexternを使用する必要があります。私はC++のコードがないので、ここには当てはまりません。

ユニティのDocからの簡単な管理プラグイン:

namespace DLLTest { 

    public class MyUtilities { 

     public int c; 

     public void AddValues(int a, int b) { 
      c = a + b; 
     } 

     public static int GenerateRandom(int min, int max) { 
      System.Random rand = new System.Random(); 
      return rand.Next(min, max); 
     } 
    } 
} 

がそれをコンパイルしてユニティ<project folder>/Assetsフォルダ

使用法で.dllファイルを置く:あなたの場合は

public class Test : MonoBehaviour { 

    void Start() { 
     MyUtilities utils = new MyUtilities(); 
     utils.AddValues(2, 3); 
     print("2 + 3 = " + utils.c); 
    } 

    void Update() { 
     print(MyUtilities.GenerateRandom(0, 100)); 
    } 
} 

マネージドプラグインでUnity関数やAPIを使用しようとしている場合、あなたはhavまた、プラグインを作成する前に、そのプラグインに参照としてUnityEngine.dllを追加してください。 ソリューションエクスプローラ上だけで右クリックして、以下の次のフォルダにUnityEngine.dll探しリファレンスを追加を選択:

あなたはでWindows上でこれを見つけることができます:

Program Files\Unity\Editor\Data\Managed\UnityEngine.dll 

あなたは、Mac上でこれを見つけることができますOSX:

Applications/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll 
+0

私は、ネイティブ/マネージドプラグインが何であるかについて間違った考えをしていると思います。私はそれがUWP固有であるため、Unityによってコンパイルできない 'var localSettings = ApplicationData.Current.LocalSettings; 'のようなコードを含んでいるため、ネイティブプラグインだと言いました。しかし、あなたは私のプラグインが管理されたプラグインであると言っています(なぜならC#で管理された言語で書かれているからです)。 – Corcus

+0

あなたが言ったように実際に私はそれを使用し、それは動作します。 – Corcus

+0

あなたは大歓迎です。コメントする前に必ず解決策を試してください。 – PassetCronUs

関連する問題