Export funkcji z C# - nie znaleziono punktu wejścia

Export funkcji z C# - nie znaleziono punktu wejścia
FL
  • Rejestracja:około 12 lat
  • Ostatnio:około rok
  • Postów:20
0

Chciałbym zaimportować funkcję napisaną w C# do programu w lazarusie, wybrałem pattern wrappera w C++/CLI.

C#:

Kopiuj
namespace TestLib
{
    public static class Functions
    {
        public static int Test(int x)
        {
            return x;
        }
    }
}

C++/CLI:
TestLibWrapper.h:

Kopiuj
#pragma once
#using "TestLib.dll"

using namespace System;

__declspec(dllexport) int Test(int x);

TestLibWrapper.cpp:

Kopiuj
#include "stdafx.h"
#include "TestLibWrapper.h"

int Test(int x)
{
	return TestLib::Functions::Test(x);
}

Lazarus:

Kopiuj
function Test(x: Integer) : Integer; stdcall; external 'TestLibWrapper.dll'; 

Wszystkie programy się budują: problem występuje natychmiast po włączeniu aplikacji w lazarusie z komunikatem błedu "Nie znaleziono punktu wejścia procedury Test w bibliotece (...)\test1.exe."
W katalogu z kodem pascala wrzuciłem na wszelki wypadek obydwie DLLe: TestLib i TestLibWrapper.
Słyszałem że delphi jest tylko 32-bitowe, ale kompilacja w x86 powodowała błąd "Nieprawidłowe uruchomienie pliku wykonwywalnego", po zmianie na target bibliotek na x64 otrzymałem opisany wyżej rezultat, widocznie w lazarusie działa to inaczej.
Zna ktoś rozwiązanie tego problemu?

edytowany 1x, ostatnio: flowCRANE
KA
"Słyszałem że delphi jest tylko 32-bitowe" no jasne bo Delphi się zatrzymało na wersji 7 z 2002 roku...
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
1

Jeśli Twój program jest 32-bitowy to raczej nie może korzystać z biblioteki 64-bitowej. Poza tym użyj konwencji cdecl:

Kopiuj
function Test(x: Integer): Integer; cdecl; external 'TestLibWrapper.dll'; 

Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
FL
  • Rejestracja:około 12 lat
  • Ostatnio:około rok
  • Postów:20
0

Rzeczywiście cdecl jest tutaj odpowiedni. Ale sednem problemu był brak atrybutu Extern "C" przy funkcji w "TestLibWrapper", nazwa funkcji była kompilowana do "int _cdecl Test(int)" bez tego. Sprawdziłem w opcjach projektu: lazarus potrafi robić 64-bitowe programy.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Tuchów
  • Postów:12175
0

@FLAMESpl: oczywiście, że Lazarus (a dokładniej – FPC) wspiera tworzenie aplikacji zarówno 32-, jak i 64-bitowych. To samo Delphi, o ile korzysta się z jakiegoś współczesnego środowiska, a nie starocia sprzed 20 lat (wtedy platform 64-bitowych nie było, więc trudno żeby ich wparcie istniało).


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.