2015-03-25 4 views
1

Я пытаюсь создать родной плагин для Unity3D Pro (5.0). До сих пор я создал DLL-файл в VS Express 2013 для Windows, я создал образец Unity только для этого и связал библиотеку, но я все еще получаю сообщение об ошибке, и я не могу двигаться. Google не очень помог в этом вопросе ...Unity3D call external dll

Я пытаюсь добавить DLL с моим собственным низкоуровневым материалом для цели Windows Store.

Все, что я пытаюсь получить доступ к этому пути, не имеет значения, я застрял в hello world примере приложения.

Visual Studio проект

Dll3.cpp

#include "pch.h" 
#include "Dll3.h" 

extern "C" __declspec(dllexport) int testFunc(int a, int b) { 
    return a + b; 
} 

Dll3.h

#pragma once 

using namespace std; 

extern "C" __declspec(dllexport) int testFunc(int a, int b); 

dllmain.cpp

#include "pch.h" 

BOOL APIENTRY DllMain(HMODULE /* hModule */, DWORD ul_reason_for_call, LPVOID /* lpReserved */) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
    case DLL_THREAD_ATTACH: 
    case DLL_THREAD_DETACH: 
    case DLL_PROCESS_DETACH: 
     break; 
    } 
    return TRUE; 
} 

pch.h

#pragma once 

#include "targetver.h" 

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 
#endif 

// Windows Header Files: 
#include <windows.h> 

pch.cpp

#include "pch.h" 

и я поставил цель сборки для x64, файл DLL успешно экспортирован без каких-либо ошибок или предупреждений.

Единство Проект

Я шлепнулся на Dll3.dll файл в папку Assets/. Сначала у меня это было в Assets/Plugins/, но я понял, что это не имеет значения.

test.cs

using UnityEngine; 
using System.Collections; 
using System.Runtime.InteropServices; 

public class test : MonoBehaviour { 

    // Dll import according to Unity Manual 
    #if UNITY_IPHONE || UNITY_XBOX360 
    [DllImport ("__Internal")] 
    #else 
    [DllImport ("Dll3")] 
    #endif 
    private static extern int testFunc (int a, int b); 

    // Use this for initialization 
    void Start() { 
     int a = 1; 
     int b = 2; 
     int c = testFunc (a, b); 
     Debug.Log (c.ToString()); 
    } 

    // Update is called once per frame 
    void Update() { 

    } 
} 

Затем я создал пустой объект игры, назначенный этот сценарий к нему, составленному и бежать. Он составлен без каких-либо ошибок или предупреждений, но при запуске (в редакторе), я получил это:

Failed to load 'Assets/Dll3.dll' with error 'This operation is only valid in the context of an app container.', GetDllDirectory returned ''. If GetDllDirectory returned non empty path, check that you're using SetDirectoryDll correctly. 
Failed to load 'Assets/Dll3.dll' with error 'This operation is only valid in the context of an app container.', GetDllDirectory returned ''. If GetDllDirectory returned non empty path, check that you're using SetDirectoryDll correctly. 
DllNotFoundException: Assets/Dll3.dll 
    test.Start() (at Assets/test.cs:18) 

Может кто-нибудь, пожалуйста, указать мне, где я делаю ошибку? Я привык к среде Unix (OSX/Linux), и Windows очень нестандартная для меня. Я полностью не понимаю концепцию проекта VS DLL. Я был бы признателен за любую помощь. Спасибо

+0

Я подозреваю, что часть VisualStudio ... эта меня больше всего сбивает с толку. Я не уверен, что я правильно экспортировал эту функцию, я не уверен, что могу экспортировать простые функции C в VC++, как это ... Я бы, безусловно, приветствовал объективный подход, но структурированный один тоже в порядке ... – sDoky

+0

Предпочтительно используйте папку «Плагины» для родных DLL, хотя звучит так, как будто это не проблема. – yoyo

+0

Почему вы используете целевой объект Windows Store? Я думаю, Win32 будет уместным. – yoyo

ответ

1

Да, это было правильно с самого начала. Мне просто нужно было запустить его в Visual Studio Simulator, в качестве приложения Store на моем рабочем столе или развернуть его на моем планшетном ПК. Он не запускается в редакторе Unity - я такой дурак :-)