"Run" выглядит как нестатический метод класса. Хотя такие методы можно вызывать из C #, это не основной вариант использования. Было бы намного проще использовать его из .NET, если вы предоставляете его через COM или, по крайней мере, в виде простого интерфейса C:
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 = "??0Test@Testing@@QAE@H@Z",
CallingConvention = CallingConvention.ThisCall,
CharSet = CharSet.Ansi)]
public static extern void TestingTestCtor(IntPtr self, int data);
[DllImport(
"NativeLib.dll",
EntryPoint = "?Run@Test@Testing@@QAEHPBD@Z",
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.