2017-05-23 6 views
0

Ich schrieb einen Code in Einheit, um einige Daten von einer Messplatte zu lesen. Leider gibt den Compiler die folgenden Fehler aus:Wie man eine .dll in Einheitscode implementiert

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

Nach einigen Recherchen fand ich heraus, dass die Einheit nicht mit .dll aus .NET-Sprachen arbeiten kann. Sie müssen es also in ein natives Plugin einfügen.

Wissen Sie, was zu tun ist oder ob es Beispielprojekte gibt?

Vielen Dank für Ihre Hilfe.

+0

* "Ich habe einen Code in Einheit geschrieben, um einige Daten von einer Messplatte zu lesen" * Welche Sprache haben Sie verwendet? Wenn dies C# ist, können Sie das verwaltete Plugin damit erstellen, ohne nativ zu gehen ... – Programmer

Antwort

0

Es gibt eine ganze Tutorial dazu können Sie hier lesen: http://www.alanzucconi.com/2015/10/11/how-to-write-native-plugins-for-unity/

Die Zusammenfassung ist:

1) Setzen Sie das native Plugin in den Assets/Plugins Ordner.

2) Definieren Sie die api in einer Klasse, wie:

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

hier ein Beispiel für SQLite Es gibt bei hier zu sehen: https://github.com/codecoding/SQLite4Unity3d

Sie sind der C# -Code zu sehen ist entlang der Linien von die oben:

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

... aber auch feststellen, wie viele #ifdef Bedingungen gibt.

Cross-Plattform-native Bindungen zu bauen ist harte Arbeit.

Beachten Sie auch diese nur gilt für C/C++ - Bibliotheken; Wenn Sie eine vorhandene C# .Net-Bibliothek (z. B. NHibernate) haben, ist die Antwort Nein, Sie können einfach nicht diese DLL verwenden; Sie müssen die C# -Quelle abrufen und sie speziell für die Einheit neu kompilieren.

+1

* "Sie können einfach nicht diese DLL verwenden; Sie müssen die C# -Quelle abrufen und sie speziell für die Einheit neu kompilieren." * Nicht wahr. Sie können. Die DLL muss nur mit .NET Version <= 3.5 erstellt werden. Das ist es. – Programmer

+0

@Programmer gibt es keine DLLs da draußen, die Ziel 3,5; Es ist eine veraltete und nicht unterstützte Laufzeit. Das habe ich gemeint, als ich sagte "Du musst die C# Quelle bekommen und sie speziell für die Einheit neu kompilieren". ... aber um fair zu sein, ja, "speziell für die Einheit" == 3.5 Laufzeit. – Doug

Verwandte Themen