c# एकता के लिए C++ प्लगइन बनाएँ



unity3d dll (1)

आप एक गैर UWP वातावरण में UWP प्लगइन लोड करने का प्रयास कर रहे हैं और इसका कारण यह है कि आप अपना dll कैसे बनाते हैं।

यह पोस्ट एकता में C ++ प्लगइन बनाने, संकलित करने और बनाने के तरीके का वर्णन करता है।

इसके लिए उपयोग किया जाने वाला सॉफ़्टवेयर संस्करण (अन्य पुराने संस्करणों के लिए भी काम करना चाहिए। भविष्य में अपडेट और अलग-अलग UI होने पर यह जानकारी केवल उल्लेखित है):

  • Microsoft Visual Studio 2015

  • एकता 2017.2.0f3

1 .Go to फ़ाइल ---> नया ---> प्रोजेक्ट ...

इंस्टॉल -> टेम्प्लेट्स ---> विजुअल C ++ फिर Win32 कंसोल एप्लिकेशन पर जाएं । प्रोजेक्ट का नाम टाइप करें फिर Ok पर क्लिक करें।

3। समाप्त के बजाय अगला क्लिक करें :

4 .लेक्ट करें DLL और अचयनित Precompiled हेडर फिर फिनिश पर क्लिक करें:

5। अब आप अपने स्रोत (.cpp) और हेडर (.h) फाइलें बना सकते हैं।

ए। स्रोत फ़ाइल बनाएँ:

इसे सोर्स फाइल्स फोल्डर में रखा जाना चाहिए। स्रोत फ़ाइलों पर राइट क्लिक करें ---> जोड़ें ---> नया आइटम ...

B .Select C ++ फ़ाइल (.cpp), फ़ाइल का नाम "FirstDLL.cpp" लिखें और फिर जोड़ें पर क्लिक करें।

उदाहरण C ++ परीक्षण स्रोत:

#include "FirstDLL.h"

int add(int num1, int num2)
{
    return num1 + num2;
}

int multiply(int num1, int num2)
{
    return num1 * num2;
}

int substract(int num1, int num2)
{
    return num1 - num2;
}

int divide(int num1, int num2)
{
    return num1 / num2;
}

A। शीर्ष लेख फ़ाइल बनाएँ:

इसे हैडर फाइल्स फोल्डर में रखा जाना चाहिए। हैडर फाइलों पर राइट क्लिक करें ---> Add ---> नया आइटम ...

B .Select Header File (.h) , फ़ाइल का नाम "FirstDLL.h" लिखें और फिर Add पर क्लिक करें।

उदाहरण संबंधित हेडर:

#ifndef FIRSTDLL_NATIVE_LIB_H
#define FIRSTDLL_NATIVE_LIB_H

#define DLLExport __declspec(dllexport)

extern "C"
{
    DLLExport int add(int num1, int num2);
    DLLExport int multiply(int num1, int num2);
    DLLExport int substract(int num1, int num2);
    DLLExport int divide(int num1, int num2);
}
#endif

बस। अब आप वहां अपना C ++ प्लगइन्स कोड लिख सकते हैं।

6। रिलीज और मंच को 64 बिट तक बिल्ड सेट करना सुनिश्चित करें

यदि 32-बिट का उपयोग कर रहे हैं, तो प्लेटफ़ॉर्म को x86 पर सेट करें।

।। बिल्डिंग प्लगइन:

बिल्ड ---> बिल्ड सॉल्यूशन पर जाएं

।। एकता में आयात:

पीसी, मैक और लिनक्स स्टैंडअलोन :

64-बिट dll फ़ाइल को Assets/Plugins फ़ोल्डर में रखें।

यदि आप केवल 32-बिट का समर्थन करना चाहते हैं तो Assets/Plugins/x86 में प्लगइन डालें।

यदि आप सार्वभौमिक (दोनों 32-बिट और 64-बिट प्लेटफ़ॉर्म) का समर्थन करना चाहते हैं, तो डीएल को इस तरह से बनाएं और इसे Assets/Plugins/x86_64 फ़ोल्डर में डालें।

Android :

एंड्रॉइड स्टूडियो से बनाया जा सकता है।

विजुअल स्टूडियो से निर्माण करने के लिए:

A .Go to फ़ाइल ---> नया ---> प्रोजेक्ट ...

बी Installed -> Templates ---> Visual C ++ पर जाएँ फिर Cross Platform पर जाएँ C ++ (अपडेट x) के लिए इंस्टॉल एंड्रॉइड सपोर्ट पर क्लिक करें । फिर इसे स्थापित करने के लिए दिशा का पालन करें।

सी इंस्टॉल -> टेम्प्लेट्स ---> विजुअल C ++ ---> क्रॉस प्लेटफॉर्म पर जाएं । फिर एंड्रॉइड डायनेमिक शार्द लाइब्रेरी (Android) का चयन करें और फिर प्रोजेक्ट का नाम टाइप करें और Ok पर क्लिक करें। अब, आप C ++ में कोडिंग जारी रखने के लिए # 5 चरण पर वापस जा सकते हैं।

Assets/Plugins/Android फ़ोल्डर में एंड्रॉइड प्लगइन फाइल (डीएलएल नहीं) डालें। समर्थित C ++ प्लगइन एक्सटेंशन .so

नोट : यदि एंड्रॉइड प्लगइन का नाम libFirstDLL-lib.so , .so C # से संदर्भित करते समय lib उपसर्ग और .so हटा दें। इस मामले में, यह इसके विपरीत [DllImport("FirstDLL-lib")] होगा। # 9 में होता।

यदि आपके पास armeabi-v7a और x86 एंड्रॉइड .so प्लगइन्स दोनों हैं, तो उन्हें क्रमशः Assets\Plugins\Android\libs\armeabi-v7a और Assets\Plugins\Android\libs\x86 फ़ोल्डरों में डालें।

आईओएस

Xcode से बनाया जा सकता है या एकता में स्रोत फ़ाइल शामिल कर सकते हैं। आप इसे विजुअल स्टूडियो के साथ भी बना सकते हैं। बस ऊपर दिए गए Android चरण का अनुसरण करें लेकिन C ++ (अपडेट x) के लिए इंस्टॉल किए गए Android समर्थन के बजाय C ++ (अपडेट x) के लिए इंस्टॉल किए गए iOS समर्थन का उपयोग करें । ध्यान दें कि आपको iOS के लिए बनाने या वर्चुअल मशीन का उपयोग करने के लिए मैक कंप्यूटर की आवश्यकता है। एक बार जब आप ऐसा कर लेते हैं, तो सेटअप समाप्त करने के लिए Microsoft के this निर्देश का पालन this ताकि विज़ुअल स्टूडियो आपके मैक ओएस पर प्रोजेक्ट का संचार और निर्माण कर सके।

आईओएस प्लगइन फ़ाइल (डीएलएल नहीं) को Assets/Plugins/iOS फ़ोल्डर में डालें। समर्थित प्लगइन्स एक्सटेंशन .a , .m , .mm , .c , .cpp

जैसा कि # 9 में नीचे देखा गया है, [DllImport("PluginName")] या [DllImport ("__Internal")] बजाय [DllImport("PluginName")] उपयोग करना चाहिए।

एकता / C # से C ++ फ़ंक्शन को कॉल करना :

[DllImport("FirstDLL")]
public static extern int add(int num1, int num2);
[DllImport("FirstDLL")]
public static extern int multiply(int num1, int num2);
[DllImport("FirstDLL")]
public static extern int substract(int num1, int num2);
[DllImport("FirstDLL")]
public static extern int divide(int num1, int num2);


void Start()
{
    Debug.Log("Add: " + add(10, 2));
    Debug.Log("Multiply: " + multiply(10, 2));
    Debug.Log("Substract: " + substract(10, 2));
    Debug.Log("Divide: " + divide(10, 2));
}

आउटपुट :

१० TROUBLESHOOTING PLUGIN ERRORS:

1। त्रुटि को पूरा करना:

DllNotFoundException:

समाधान 1 :

DllImport में निर्दिष्ट DLL का नाम Dll नाम से मेल नहीं खाता है। सुनिश्चित करें कि वे नाम बदलने से मेल खाते हैं फिर एकता को पुनरारंभ करें।

समाधान 2 :

DLL को गलत फ़ोल्डर में रखा गया है। फ़ोल्डर का नाम Assets/Plugins होना चाहिए। वर्तनी भी संवेदनशील है।

2। त्रुटि को पूरा करना:

EntryPointNotFoundException:

समाधान 1 :

DllImport का फ़ंक्शन नाम घोषित मौजूद नहीं है या C ++ की ओर से घोषित किए गए के साथ मेल खाता है। सुनिश्चित करें कि वर्तनी दोनों तरफ समान हैं। वर्तनी भी संवेदनशील है।

समाधान 2 :

C ++ DLL फ़ंक्शन C ++ प्लगइन में शामिल नहीं किए जा रहे हैं। विंडोज पर, dllexport का उपयोग इन फ़ंक्शन को स्वयं DLL में निर्यात करने के लिए किया जाता है। अन्य प्लेटफार्मों या ओएस में इसकी आवश्यकता नहीं है। यह आमतौर पर हेडर फ़ाइल में किया जाता है केवल स्रोत फ़ाइल को साफ रखने के लिए। ऊपर हेडर फ़ाइल में उदाहरण देखें या नीचे स्क्रीनशॉट।

समाधान 3 :

आप संकलक C ++ फ़ंक्शन का नाम बदल रहे हैं। आप इसे extern कीवर्ड के साथ संलग्न करके रोक सकते हैं। फिर से, शीर्ष लेख फ़ाइल में उदाहरण देखें या नीचे स्क्रीनशॉट:

2। कोई त्रुटि नहीं लेकिन गलत या वायर्ड परिणाम:

समाधान 1 :

पैरामीटर मेल नहीं खाता। सुनिश्चित करें कि C ++ और C # साइड मैच पर फ़ंक्शन के पैरामीटर और पैरामीटर की समान राशि है। इसके अलावा डेटाटाइप को मेल खाना चाहिए। यदि वे नहीं करते हैं, तो अपरिभाषित व्यवहार की अपेक्षा करें।

मेरा पहला प्लगइन बनाने की कोशिश कर रहा है। सीपीपी कोड है:

शीर्षक:

#pragma once
#ifndef __MY_DLL_H
#define __MY_DLL_H

extern "C" int add_1(int number);

#endif

स्रोत:

//FirstDLL.cpp
#include "FirstDLL.h"

extern "C" int add_1(int number) {
    return number + 1;
}

फिर मैं Assets/Plugins फ़ोल्डर में डीएलएल को संकलित करता हूं और डालता हूं, डीएलएल फाइल FirstDLL.dll । एकता पक्ष से मेरे पास एक घटक के लिए एक सरल C # स्क्रिप्ट है:

using UnityEngine;

public class MyBehaviour : MonoBehaviour {

    // Use this for initialization
    [Header("Nuts!")]
    public int my_curr_val;
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        print(add_1(my_curr_val));
    }

    [DllImport("FirstDLL")]
    public static extern int add_1(int number);
}

लेकिन जब मैं स्क्रिप्ट को चलाने की कोशिश करता हूं तो मुझे निम्नलिखित त्रुटि मिलती है:

प्लगइन्स: त्रुटि के साथ 'एसेट्स / प्लगइन्स / फ़र्स्टडीएलएलडॉल' लोड करने में विफल 'यह ऑपरेशन केवल ऐप कंटेनर के संदर्भ में मान्य है। '। प्लगइन्स: त्रुटि के साथ 'एसेट्स / प्लगइन्स / फ़र्स्टडीएलएलडॉल' लोड करने में विफल 'यह ऑपरेशन केवल ऐप कंटेनर के संदर्भ में मान्य है। '। DllNotFoundException: FirstDLL MyBehaviour.Update () (आस्तियों / MyBehaviour.cs पर: 17)

प्रलेखन काफी खराब लगता है, कोई सुझाव? यह उत्तर है , लेकिन मुझे यकीन नहीं है कि मैं क्या गलत कर रहा हूं। मैंने कई समाधान बनाने की कोशिश की है (विंडोज़ सार्वभौमिक प्लेटफ़ॉर्म, विंडोज़ 8.1, आदि) अभी भी काम नहीं करता है।





dll