ネイティブC/C ++コードのC ++/CLIラッパー、Unity3Dにロードできません

StackOverflow https://stackoverflow.com/questions/5313351

質問

私はUnity3Dにアセンブリをロードする方法についてネット全体を探していて、本当に苦労しています。この投稿が長くなると申し訳ありませんが、.NETとDLLで初めて作業したので、私が学んだことすべてを置いて、私がどれだけ到達したかを説明します。

私はネイティブのDLLを持っています、それはextern "c"の全体の束を持っているので、実行時にすべてをロードできます。 [dllimport]属性などを使用すると、これは統一されます。ただし、面倒で、実際には再利用可能なコードではありません。 1つ以上のネイティブライブラリの間でシステムを抽象化する必要があるとき、それはさらに面倒になります。

それで、私はC +++/CLIラッパーを実行してから、他のDLLと同様にUnity3Dにロードし、名前空間をリンクするだけです。「MyWrapperを使用してください。」

考えられる最もシンプルなC ++/CLI LIBを作成しました。私のlibが行うのは、クラス(class1)があり、int getnum(){return 5;}を備えています。 VC ++ 2010 Expressを使用しており、V90で構築しており、VCXProjファイルをターゲット2.0に変更しました。 Unityは2.0のみをサポートすることを知っています。ネイティブコードと.NETコードを持つことができるように、 /CLRを構築しています。

Unity3dを完全にクラッシュさせます。これは、GameManager.awake()[0x0001d]のManager gamemanager.csの私のエラーログです。Manager.awake()[0x00000]のManager gamemanager.cs:107 at(wrapper runtime-invoke)guiradiobutton.runtime_invoke_void(オブジェクト、intptr、intptr、intptr)<0xfffffffff>未処理のヌル例外を受信

/clrで構築する場合:代わりに安全に機能します。 /CLR:純粋にも機能しません。

そこで、私はすべてをテストするために外部C#コマンドラインプロジェクトを行うことにしました。 LIBをロードし、2.0および / /CLR(混合モード)でコンパイルして問題なくコンパイルします。

Unity 2.6 Proを使用しています。

それはおそらく私がやろうとしていることは不可能です、私は知りません..私はそれが.NETがすべてであることだと思いました。他のプロジェクト(C ++)で再利用できるシステムが欲しいだけです。

洞察をありがとう。

これが私のテストC ++/CLIプロジェクトです。

#pragma once

using namespace System;

namespace CLRTest {

    public ref class Class1
    {
        // TODO: Add your methods for this class here.
    public:

        Class1(){}

        int getnum (){return 5;}
    };
}

このようなC#コマンドラインプロジェクトを作成するとき。できます。

using System;
using System.Collections.Generic;
using System.Text;
using CLRTest;

namespace CLRTestLoad
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c = new Class1();

            Console.WriteLine ("num is = " + c.getnum());
        }
    }
}

Unity3Dでこの行を実行すると、エディター全体がクラッシュします。 (はい、私は声明を使用しました)

Class1 c = new Class1();
役に立ちましたか?

解決

AFAIK, C++/CLI assemblies are not working with Unity, as Unity is relying on Mono that doesn't support mixed assemblies. The only workaround is to call functions from a dll with classic p/invoke

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top