c# - 在 Unity 中使用 DLL,MonoBehaviour

标签 c# c++ dll unity3d dllimport

我有一个用 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 );
}

在测试脚本文件中,在第一个 block 中使用 StripController 并在本地调用 NILLWingEX 工作正常。但是在第二个 block 中,StripController 从该文件调用 NILLWingEX,我得到一个 EntryPointNotFoundException: NILLWingEX。所以我可以从测试脚本文件调用外部函数,但不能调用我的其他文件?这与继承自 MonoBehaviour 有关系吗?这是否与测试脚本附加到游戏对象(主摄像机)有关?

如果您能帮助阐明何时/何地可以和不能在 Unity 中调用库函数,我们将不胜感激。

最佳答案

其实我好像还不够讲究。测试脚本调用 NILLWingEx 并且 StripController 使用大写字母“X”调用 NILLWingEX。我不确定那是怎么进去的。所以我只是在打字错误上吹了一天半...

关于c# - 在 Unity 中使用 DLL,MonoBehaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816171/

相关文章:

c# - binarywriter.flush() 是否也刷新底层文件流对象?

C++引用与指针的关系

c++ - 错误 C2664 : multimap in map

windows - 如果加载它的 DLL 被卸载,DLL 是否会被删除?

c# - 使用 MVVM 在 UWP 中处理 ListView ItemClick 的最佳实践

c# - 如何使用 mysql 删除附加行

c# - 注册 tlb COM

c++ - 是否可以访问 C++ 模板模板常量参数?

delphi - 如何调试使用 regsvr32.exe 制作的 64 位 dll 注册过程?

c++ - 通过对 dll 的 stdcall 操作字符串时出现问题