DLL不能在C#中工作
每当我尝试通过Visual Studio在C#中引用我自己的DLL时,它告诉我它无法引用DLL,因为它不是COM库.
我已经在互联网上搜索了一个解决方案,没有明确的答案或帮助任何真正的地方.它是一个相当“简单”的DLL,它从指纹扫描仪中捕获原始图像数据.我已经测试过C代码在我尝试将它变成DLL之前工作得很好,只是你知道. 我关注如何制作DLL的微软指南,这是我最终得到的: > JTBioCaptureFuncsDll.h JTBioCaptureFuncsDll.h #ifdef JTBIOCAPTUREFUNCSDLL_EXPORTS #define JTBIOCAPTUREFUNCSDLL_API __declspec(dllexport) #else #define JTBIOCAPTUREFUNCSDLL_API __declspec(dllimport) #endif using byte = unsigned char*; struct BioCaptureSample { INT32 Width; INT32 Height; INT32 PixelDepth; byte Buffer; }; JTBioCaptureFuncsDll.cpp // JTBioCapture.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" namespace JTBioCapture { using byte = unsigned char*; class JTBioCapture { public: // Returns a Struct with Information Regarding the Fingerprint Sample static JTBIOCAPTUREFUNCSDLL_API BioCaptureSample CaptureSample(); }; } JTBioCapture.cpp /* * Courtesy of WinBio God Satish Agrawal on Stackoverflow */ BioCaptureSample CaptureSample() { HRESULT hr = S_OK; WINBIO_SESSION_HANDLE sessionHandle = NULL; WINBIO_UNIT_ID unitId = 0; WINBIO_REJECT_DETAIL rejectDetail = 0; PWINBIO_BIR sample = NULL; SIZE_T sampleSize = 0; // Connect to the system pool. hr = WinBioOpenSession( WINBIO_TYPE_FINGERPRINT,// Service provider WINBIO_POOL_SYSTEM,// Pool type WINBIO_FLAG_RAW,// Access: Capture raw data NULL,// Array of biometric unit IDs 0,// Count of biometric unit IDs WINBIO_DB_DEFAULT,// Default database &sessionHandle // [out] Session handle ); if (FAILED(hr)) { wprintf_s(L"n WinBioOpenSession failed. hr = 0x%xn",hr); goto e_Exit; } // Capture a biometric sample. wprintf_s(L"n Calling WinBioCaptureSample - Swipe sensor...n"); hr = WinBioCaptureSample( sessionHandle,WINBIO_NO_PURPOSE_AVAILABLE,WINBIO_DATA_FLAG_RAW,&unitId,&sample,&sampleSize,&rejectDetail ); if (FAILED(hr)) { if (hr == WINBIO_E_BAD_CAPTURE) { wprintf_s(L"n Bad capture; reason: %dn",rejectDetail); } else { wprintf_s(L"n WinBioCaptureSample failed. hr = 0x%xn",hr); } goto e_Exit; } wprintf_s(L"n Swipe processed - Unit ID: %dn",unitId); wprintf_s(L"n Captured %d bytes.n",sampleSize); // Courtesy of Art "Messiah" Baker at Microsoft PWINBIO_BIR_HEADER BirHeader = (PWINBIO_BIR_HEADER)(((PBYTE)sample) + sample->HeaderBlock.Offset); PWINBIO_BDB_ANSI_381_HEADER AnsiBdbHeader = (PWINBIO_BDB_ANSI_381_HEADER)(((PBYTE)sample) + sample->StandardDataBlock.Offset); PWINBIO_BDB_ANSI_381_RECORD AnsiBdbRecord = (PWINBIO_BDB_ANSI_381_RECORD)(((PBYTE)AnsiBdbHeader) + sizeof(WINBIO_BDB_ANSI_381_HEADER)); PBYTE firstPixel = (PBYTE)((PBYTE)AnsiBdbRecord) + sizeof(WINBIO_BDB_ANSI_381_RECORD); int width = AnsiBdbRecord->HorizontalLineLength; int height = AnsiBdbRecord->VerticalLineLength; wprintf_s(L"n ID: %dn",AnsiBdbHeader->ProductId.Owner); wprintf_s(L"n Width: %dn",AnsiBdbRecord->HorizontalLineLength); wprintf_s(L"n Height: %dn",AnsiBdbRecord->VerticalLineLength); BioCaptureSample returnSample; byte byteBuffer; for (int i = 0; i < AnsiBdbRecord->BlockLength; i++) { byteBuffer[i] = firstPixel[i]; } returnSample.Buffer = byteBuffer; returnSample.Height = height; returnSample.Width = width; returnSample.PixelDepth = AnsiBdbHeader->PixelDepth; /* * NOTE: (width / 3) is necessary because we ask for a 24-bit BMP but is only provided * a greyscale image which is 8-bit. So we have to cut the bytes by a factor of 3. */ // Commented out as we only need the Byte buffer. Comment it back in should you need to save a BMP of the fingerprint. // bool b = SaveBMP(firstPixel,(width / 3),height,AnsiBdbRecord->BlockLength,L"C:UserssmfDesktopfingerprint.bmp"); // wprintf_s(L"n Success: %dn",b); e_Exit: if (sample != NULL) { WinBioFree(sample); sample = NULL; } if (sessionHandle != NULL) { WinBioCloseSession(sessionHandle); sessionHandle = NULL; } wprintf_s(L"n Press any key to exit..."); _getch(); return returnSample; } 我们的想法是在C#中调用“CaptureSample()”,然后代码尝试捕获指纹扫描.当它进行扫描时,应该将结构返回到它可以使用的C#,保持: >字节缓冲区 但是当我尝试在我的C#项目中引用DLL时,我收到以下错误: 我也尝试使用TlbImp.exe工具制作DLL但无济于事.它告诉我DLL不是有效的类型库. 所以我在这里有点失落.我是C的新手,所以制作Interop / COM组件不是我以前做过的,也不是在C#中使用DLL. 解决方法
您不能在.NET项目中引用用C编写的非托管代码库.
因此,要从这样的库中调用代码,您必须使用 DllImport ,或使用
WrapperClass .
我提到了这个答案:https://stackoverflow.com/a/574810/4546874. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |