DLL, a C#

H2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:64
0

Witam
Napisałem zewnętrzną DLL w języku C i za pomocą PInvoke importuje ją do projektu w C#. Na moim komputerze wszystko działa jednak na każdym innym wyświetlany jest błąd. Najpierw wkleję poniżej kody.

Kod wywołujący funkcję z zewnętrznej DLL w C#:

Kopiuj
[DllImport("SimpleScanA0DLL.dll", CharSet = CharSet.Ansi)]
        private static extern int ScanB( string filename, int mode, int dpi, int width, int height);

        public void StartScanA0()
        {
            string test = "test.bmp";
            int k = ScanB( test, 0, 200, 400, 600);
            if(k == -99)
            {
                slog.Info("Bląd przy otwieraniu biblioteki skanera.\n");
            }
           
            else if (k == 0)
            {
                slog.Info("Skanowanie zakonczylo sie powodzeniem.\n");
            }
            else
            {
                slog.Info("Wystapil nieznany błąd.\n");
            }
        }   

Kod w języku C:

Kopiuj
extern "C"
{
	_declspec(dllexport) int __stdcall ScanB(char* filename, int mode, int dpi, int width, int height)
	{
		char m = 'C';
		if (mode == 0) {
			m = 'G';
		}
		return Scan(filename, m, dpi, width, height);
	}
}

Komunikat błędu:
"System.DllNotFoundException: Nie można załadować biblioteki DLL 'SimpleScanA0DLL.dll': Nie można odnaleźć określonego modułu. (Wyjątek od HRESULT: 0x8007007E)
w SimpleScanA0.A0DLL.ScanB(String filename, Int32 mode, Int32 dpi, Int32 width, Int32 height)
w SimpleScanA0.A0DLL.StartScanA0() w C:\Users\A.Kordecki\Documents\simplescan\A0Scann\A0DLL.cs:wiersz 21"

Ma ktoś pomysł jak to rozwiązać?

a_s_f
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Rzeszów
0

A dołączasz tą bibliotekę do swojej aplikacji?

H2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:64
0

Jest w folderze w którym jest plik .exe oraz w samym projekcie w Visual Studio 2017.

a_s_f
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Rzeszów
0

Nazwy też się zgadzają?

H2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:64
0

No przekopiowałem cały folder Debbug, który na moim komputerze działa na parę innych i na nich wywala ten błąd więc nie upatrywałbym problemu w nazwie.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:9 miesięcy
  • Postów:6610
1

niekoniecznie chodzi o tą konkretną dllkę - może chodzić o jakąś dllkę, której wymaga rzeczona dllka a której nie ma :). Zazwyczaj wystarczy zainstalować vcredist w odpowiedniej wersji.
BTW jest coś takiego jak Dependency Walker, który pokaże Ci czego nie ma


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
H2
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:64
0

Temat do ewentualnego zamknięcia. Problem rozwiązałem wykorzystując DLLImport. Trzeba jednak pamiętać by skompilować program opcją 'Release', a nie 'Debbug'. Póki co wytestowałem program na trzech komputerach i działa. W wersji 'Debbug' nie działa, nie wiem dlaczego, ale już mnie to nie interesuje. Cel osiągnięty.

Sarrus
A powinno Cię to interesować. No chyba, że już nie napiszesz więcej programów.
TK
Powodem bledu ladowania moze byc niezgodnosc architektur apka<->dll. Jezeli dll jest dla 32 bit, release dla 32, a debug na kod pośredni a kompa masz 64 bity to nici z ladowania. Albo odwrotnie - dll masz na 64 bity, release na 64 bity lub posredni w win 64 bitowym, a debug leci w 32 bitach.
Sarrus
@tomasz-k Jeżeli masz niezgodność architektury (x86, x64), dostaniesz BadImageFormatException

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.