"実行"は、非静的なクラスメソッドのように見えます。 C#からこのようなメソッドを呼び出すことは可能ですが、これは主なユースケースではありません。あなたはCOM経由、またはAT-少なくともプレーンなCインタフェースとして公開している場合には、.NETからそれを消費する方法容易になるだろう:
extern "C" __declspec(dllexport) void* Testing_Test_Create();
extern "C" __declspec(dllexport) void Testing_Test_Destroy(void* self);
extern "C" __declspec(dllexport) int Testing_Test_Run(void* self, char* filePath, bool bEntry, double duration);
そしてここでは、C#からC++クラスのメソッドを呼び出す方法のサンプルです:
// Test.cpp in NativeLib.dll
namespace Testing
{
class __declspec(dllexport) Test
{
public:
explicit Test(int data)
: data(data)
{
}
int Run(char const * path)
{
return this->data + strlen(path);
}
private:
int data;
};
}
// Program.cs in CSharpClient.exe
class Program
{
[DllImport(
"NativeLib.dll",
EntryPoint = "[email protected]@@[email protected]@Z",
CallingConvention = CallingConvention.ThisCall,
CharSet = CharSet.Ansi)]
public static extern void TestingTestCtor(IntPtr self, int data);
[DllImport(
"NativeLib.dll",
EntryPoint = "[email protected]@[email protected]@[email protected]",
CallingConvention = CallingConvention.ThisCall,
CharSet = CharSet.Ansi)]
public static extern int TestingTestRun(IntPtr self, string path);
static void Main(string[] args)
{
var test = Marshal.AllocCoTaskMem(4);
TestingTestCtor(test, 10);
var result = TestingTestRun(test, "path");
Console.WriteLine(result);
Marshal.FreeCoTaskMem(test);
}
}
エントリポイント名は、お使いのビルド構成/コンパイラごとに異なることが、ので、それらを得るために、ユーティリティDUMPBIN使用する場合があります。繰り返しますが、これは概念の証明にすぎず、実際のコードではCOMを使用する方が良いでしょう。
どのような種類のDLLですか? Cで書かれていますか? –
これはCOM DLLではないと私は推測しています。 DLLの 'Run'関数がエクスポートされていますか? –