2017-08-03 112 views
0

我正在尝试为Unity开发本地插件(使用Unity 2017.1.0f3和VS 2015)。我的本地插件的目标平台是UWP,插件是用C#编写的。用C#编写的本地插件EntryPointNotFoundException

下面是我的插件和我的脚本在Unity中的代码。

插件代码在类库针对Windows 10 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; 
     } 
    } 

统一的脚本代码

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); 
     } 
    } 
} 

编译它,并把.dll文件在统一<project folder>/Assets文件夹

用法:

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 e在构建之前也将UnityEngine.dll作为参考添加到您的插件中。只需右键点击解决方案资源管理器并选择添加引用然后寻找UnityEngine.dll在下面的以下文件夹:

您可以找到这个在Windows上:

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

你可以找到这个在Mac OSX:

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

我认为我可能对于本机/托管插件有错误的想法。我说它是一个本地插件,因为它包含了像'var localSettings = ApplicationData.Current.LocalSettings;'这样的代码,由于它是UWP特定的,所以不能由Unity编译。但是你说我的插件仍然是一个托管插件(因为它是用C#编写的托管语言),我是对的吗? – Corcus

+0

其实我按照你的说法使用它,它可以工作。 – Corcus

+0

不客气。请在评论前尝试解决方案。 – PassetCronUs