Метод поиска ошибок C # в DLLImport - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть сборка C ++, которую я импортирую с помощью DLLImport.

Я пытаюсь вызвать его метод:

namespace Testing
{
class Test{
int Run(char* filePath, bool bEntry, double duration){//code}
};
}

от

[DllImport(dllName, CharSet = CharSet.Auto)]
        public static extern int Run(string filePath, bool bEntry, double duration)
            );

Когда япри вызове его метода я получаю сообщение об ошибке:

Не удается найти точку входа с именем Run in dll

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

"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.

0 голосов
/ 03 февраля 2011

Я не уверен, что это поможет, если функция является членом класса, но чтобы найти точку входа по имени, а не по порядковому номеру, вам понадобится файл .def в вашей dll.

LIBRARY  mylib
    Run @1
0 голосов
/ 03 февраля 2011

Смотрите здесь: http://dotnetperls.com/dllimport

...