如何在统一代码中实现.dll

时间:2017-05-23 15:27:12

标签: c# unity3d plugins dllimport

我写了一个统一的代码来读取测量板上的一些数据。不幸的是,编译器出现以下错误:

Assets/Scribts/Initialize.cs(74,35): error CS0246: The type or namespace name `IDevice' could not be found. Are you missing an assembly reference?

经过一番研究后,我发现统一不能与.NET语言中的.dll一起使用。因此,您必须将其放入本机插件中。

您知道该做什么或是否有一些示例项目?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以在此处阅读完整的教程:http://www.alanzucconi.com/2015/10/11/how-to-write-native-plugins-for-unity/

摘要是:

1)将原生插件放入Assets/Plugins文件夹。

2)在类中定义api,如:

[DllImport("TestDLL", EntryPoint = "TestSort")]
public static extern void TestSort(int [] a, int length);

这里有一个sqlite示例:https://github.com/codecoding/SQLite4Unity3d

您将看到C#代码与上述内容相符:

[DllImport("sqlite3", EntryPoint = "sqlite3_open", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db);

[DllImport("sqlite3", EntryPoint = "sqlite3_open_v2", CallingConvention=CallingConvention.Cdecl)]
public static extern Result Open ([MarshalAs(UnmanagedType.LPStr)] string filename, out IntPtr db, int flags, IntPtr zvfs);

[DllImport("sqlite3", EntryPoint = "sqlite3_open_v2", CallingConvention = CallingConvention.Cdecl)]
public static extern Result Open(byte[] filename, out IntPtr db, int flags, IntPtr zvfs);

[DllImport("sqlite3", EntryPoint = "sqlite3_open16", CallingConvention = CallingConvention.Cdecl)]
public static extern Result Open16([MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr db);

[DllImport("sqlite3", EntryPoint = "sqlite3_enable_load_extension", CallingConvention=CallingConvention.Cdecl)]
public static extern Result EnableLoadExtension (IntPtr db, int onoff);

...但也注意到有多少#ifdef个条件。

构建跨平台本机绑定非常困难。

另请注意,此适用于C / C ++库;如果你有一个现有的C#.Net库(例如NHibernate),答案是否定的,你只是扁平化不能使用那个DLL;你必须获得C#源并专门为了统一重新编译它。