在 Unity 中使用 DLL,MonoBehaviour
Posted
技术标签:
【中文标题】在 Unity 中使用 DLL,MonoBehaviour【英文标题】:Using DLL in Unity, MonoBehaviour 【发布时间】:2014-05-22 20:08:13 【问题描述】:我有一个用 C 语言编写的机翼几何和流动求解器代码库。我制作了一个简单的测试项目,用于调试库、我的 C# 包装类和我的主项目之间的一些集成问题。在这个测试项目中,我有一个测试脚本:
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Collections;
using System.Runtime.InteropServices;
public class testScript2 : MonoBehaviour
// external functions
[DllImport( "TestLib" )]
public static extern void makeWing( ref stripCalcStruct wing,
int n_sections, bool isSwept, double sweep );
[DllImport( "TestLib" )]
public static extern void makeComp( ref stripCalcStruct wing,
ref compNILLStruct wingComp );
[DllImport( "TestLib" )]
public static extern void NILLWingEx( ref stripCalcStruct wing,
ref compNILLStruct comp, ref outNILL results, bool simpsons );
// member variables to store computation results
public double calculation1 = 0.0;
public double calculation2 = 0.0;
public double calculation3 = 0.0;
public double calculation4 = 0.0;
public double calculation5 = 0.0;
public double calculation6 = 0.0;
// Use this for initialization
void Start ()
// this is my "main" program
// initialize some geometric parameters
int numCS = 2;
int numControlStations = 2;
int numAirfoils = 1;
int numAiCoeffs = 10;
int n_sections = 40;
// Create a StripController
StripController controller1 = new StripController(
n_sections, numCS, numControlStations, numAirfoils, numAiCoeffs );
controller1.tryStuff();
// Fill the wing geometry with a default wing from the library
makeWing( ref controller1.wing, 40, false, 0.0 );
// save a piece to see that it worked
calculation1 = controller1.wing.area;
// Fill computational state parameters with default values from the library
makeComp( ref controller1.wing, ref controller1.comp );
// save a piece to see that it worked
calculation2 = controller1.getAlphaAtIndex( 0 );
// Call the flow solver from the library
NILLWingEx( ref controller1.wing, ref controller1.comp,
ref controller1.results, false );
// save the required computation time
calculation3 = controller1.results.time;
// free pinned memory in the controller
controller1.freeStuff();
/* Try this again, but this time call the NILLWingEX function from
* within the StripController file */
StripController controller2 = new StripController(
n_sections, numCS, numControlStations, numAirfoils, numAiCoeffs );
controller2.tryStuff();
makeWing( ref controller2.wing, 40, false, 0.0 );
calculation4 = controller2.wing.area;
makeComp( ref controller2.wing, ref controller2.comp );
calculation5 = controller2.getAlphaAtIndex( 0 );
controller2.EvalNILL(); // This fails
calculation6 = controller2.results.time;
controller2.freeStuff();
// Update is called once per frame
void Update ()
void OnGUI()
// display our computation results on the screen
GUI.Label( new Rect( 100f, 100f, 500f, 20f ), calculation1.ToString() );
GUI.Label( new Rect( 100f, 120f, 500f, 20f ), calculation2.ToString() );
GUI.Label( new Rect( 100f, 140f, 500f, 20f ), calculation3.ToString() );
GUI.Label( new Rect( 100f, 160f, 500f, 20f ), calculation4.ToString() );
GUI.Label( new Rect( 100f, 180f, 500f, 20f ), calculation5.ToString() );
GUI.Label( new Rect( 100f, 200f, 500f, 20f ), calculation6.ToString() );
有一个 StripController.cs 文件包含 StripController
类。类的顶部是这样的
public class StripController
[DllImport( "TestLib" )]
public static extern void NILLWingEX( ref stripCalcStruc wing,
ref compNILLStruct comp, ref outNILL results, bool simpsons );
因此它与另一个文件具有相同的外部NILLWingEX
定义。 EvalNILL()
方法看起来像这样
public void EvalNILL()
NILLWingEX( ref wing, ref comp, ref results, false );
在测试脚本文件中,在第一个块中使用StripController
并在本地调用NILLWingEX
可以正常工作。但是在第二个块中,我从该文件中调用了StripController
调用NILLWingEX
,我得到了一个EntryPointNotFoundException: NILLWingEX
。所以我可以从测试脚本文件中调用外部函数,但不能从我的其他文件中调用?这与从 MonoBehaviour 继承有关吗?这是否与测试脚本附加到游戏对象(主摄像头)这一事实有关?
如有任何帮助澄清何时/何地可以和不能在 Unity 中调用库函数,我们将不胜感激。
【问题讨论】:
在不从 MonoBehaviour 继承的类中使用 DLL 没有问题。 testScript2 和 StripController 是否都存在于同一个 Unity 项目中? 【参考方案1】:实际上,我似乎还不够挑剔。测试脚本调用NILLWingEx
和StripController
调用NILLWingEX
并带有大写的“X”。我不确定那是怎么进去的。所以我才吹了一天半的错字...
【讨论】:
以上是关于在 Unity 中使用 DLL,MonoBehaviour的主要内容,如果未能解决你的问题,请参考以下文章