每当我尝试通过Visual Studio在C#中引用我自己的DLL时,它告诉我它无法引用DLL,因为它不是COM库.
@H_301_51@解决方法
我已经在互联网上搜索了一个解决方案,没有明确的答案或帮助任何真正的地方.它是一个相当“简单”的DLL,它从指纹扫描仪中捕获原始图像数据.我已经测试过C代码在我尝试将它变成DLL之前工作得很好,只是你知道.
我关注如何制作DLL的微软指南,这是我最终得到的:
> JTBioCaptureFuncsDll.h
> JTBioCaptureFuncsDll.cpp
> JTBioCapture.cpp
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%x\n",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: %d\n",rejectDetail); } else { wprintf_s(L"\n WinBioCaptureSample Failed. hr = 0x%x\n",hr); } goto e_Exit; } wprintf_s(L"\n Swipe processed - Unit ID: %d\n",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: %d\n",AnsiBdbHeader->ProductId.Owner); wprintf_s(L"\n Width: %d\n",AnsiBdbRecord->HorizontalLineLength); wprintf_s(L"\n Height: %d\n",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:\\Users\\smf\\Desktop\\fingerprint.bmp"); // wprintf_s(L"\n Success: %d\n",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#,保持:
>字节缓冲区
>图像高度
>图像宽度
>图像Pixeldepth
但是当我尝试在我的C#项目中引用DLL时,我收到以下错误:
我也尝试使用TlbImp.exe工具制作DLL但无济于事.它告诉我DLL不是有效的类型库.
所以我在这里有点失落.我是C的新手,所以制作Interop / COM组件不是我以前做过的,也不是在C#中使用DLL.