【问题标题】:Native Plugin written in C# EntryPointNotFoundException用 C# EntryPointNotFoundException 编写的本机插件
【发布时间】:2017-08-03 14:50:14
【问题描述】:

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

以下是我在 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;
        }
    }

Unity脚本代码

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# 编写的。

欢迎任何帮助解决这个问题。

【问题讨论】:

  • 为什么要导入 DLL 如果是用 C++ 编写的?直接将您的 dll 包含在您的资产文件夹中并使用它。

标签: c# unity3d plugins unity3d-5


【解决方案1】:

您的问题是一个托管插件。如果您正在使用另一个环绕它的 C# 插件制作本机 C++ 插件,则只需要使用 DllImportextern。这里不是这种情况,因为我没有看到任何 C++ 代码。

来自 Unity 的 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 文件放在 Unity <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,您还必须在构建插件之前添加 UnityEngine.dll 作为对插件的引用。只需右键单击 Solution Explorer 并选择 Add Reference,然后在以下文件夹中查找 UnityEngine.dll

您可以在 Windows 上找到它:

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

你可以在 Mac OSX 上找到这个:

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

【讨论】:

  • 我想我可能对本机/托管插件有什么误解。我说它是一个原生插件,因为它包含像 var localSettings = ApplicationData.Current.LocalSettings; 这样的代码,Unity 无法编译,因为它是 UWP 特定的。但是你说我的插件仍然是一个托管插件(因为它是用 C# 一种托管语言编写的)对吗?
  • 不客气。总是在评论之前尝试解决方案。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
相关资源
最近更新 更多