Unity3Dでアセンブリをロードする方法についてネット全体を探していましたが、本当に苦労しています。この投稿が長くなると申し訳ありませんが、.netとdllでの作業は初めてなので、学んだことと得た範囲をすべて記載します。
私はネイティブdllを持っていますが、実行時にすべてをロードできるように、extern"C"がたくさんあります。[DLLImport]属性などを使用すると、これは1つになります。ただし、これは面倒で、実際には再利用可能なコードではありません。後で、複数のネイティブライブラリ間でシステムを抽象化する必要がある場合は、さらに面倒になります。
そこで、C +++ / CLIラッパーを実行してから、他のdllと同じようにUnity3dにロードし、名前空間を「usingMyWrapper;」とリンクすることにしました。
考えられる最も単純なC++/CLIライブラリを作成しました。私のlibが行うのは、クラス(Class1)だけで、関数int getnum(){return5;}があります。私はVC++2010 Expressを使用しており、V90でビルドしており、vcxprojファイルをターゲット2.0に変更しました。unityは2.0のみをサポートしていることを私は知っています。ネイティブコードと.netコードを使用できるようにするために、/clrをビルドしています。
unity3dを完全にクラッシュさせます。これは、GameManager.Awake()[0x0001d] in Manager \ GameManager.cs:116 at GameManager.Awake()[0x00000] in Manager \ GameManager.cs:107 at(wrapper runtime-invoke)GUIRadioButton.runtime_invoke_void( object、intptr、intptr、intptr)<0xffffffff>未処理のNULL例外を受信しています
代わりに/clr:safeでビルドすると、正常に動作します。/ clr:pureも機能しません。
そこで、すべてをテストするために外部のc#コマンドラインプロジェクトを実行することにしました。libをロードし、2.0でコンパイルすると、/ clr(混合モード)は問題なく動作します。
Unity2.6Proを使用しています。
それはおそらく私がやろうとしていることは不可能です、私は知りません..つまり、それが.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でこの行を実行すると、エディター全体がクラッシュします。(はい、私はusingステートメントを入れました)
Class1 c = new Class1();