用 C# EntryPointNotFoundException 编写的本机插件
Native Plugin written in C# EntryPointNotFoundException
我正在尝试为 Unity 开发原生插件(使用 Unity 2017.1.0f3 和 VS 2015)。我的原生插件的目标平台是 UWP,插件是用 C# 编写的。
下面是我在 Unity 中的插件和脚本的代码。
Class 库中的插件代码目标 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# 编写的。
欢迎任何帮助克服这个问题。
你的问题是一个托管插件。如果您正在使用另一个环绕它的 C# 插件制作本机 C++ 插件,则只需使用 DllImport
和 extern
。这里不是这种情况,因为我没有看到任何 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
我正在尝试为 Unity 开发原生插件(使用 Unity 2017.1.0f3 和 VS 2015)。我的原生插件的目标平台是 UWP,插件是用 C# 编写的。
下面是我在 Unity 中的插件和脚本的代码。
Class 库中的插件代码目标 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'
我在网上了解到,这可能是由于编译器对函数名称的混淆造成的。但这只是在 C++ 代码中。我的插件是用 C# 编写的。
欢迎任何帮助克服这个问题。
你的问题是一个托管插件。如果您正在使用另一个环绕它的 C# 插件制作本机 C++ 插件,则只需使用 DllImport
和 extern
。这里不是这种情况,因为我没有看到任何 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