加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

DLL不能在C#中工作

发布时间:2020-12-14 05:43:55 所属栏目:Windows 来源:网络整理
导读:每当我尝试通过Visual Studio在C#中引用我自己的DLL时,它告诉我它无法引用DLL,因为它不是COM库. 我已经在互联网上搜索了一个解决方案,没有明确的答案或帮助任何真正的地方.它是一个相当“简单”的DLL,它从指纹扫描仪中捕获原始图像数据.我已经测试过C代码在
每当我尝试通过Visual Studio在C#中引用我自己的DLL时,它告诉我它无法引用DLL,因为它不是COM库.

我已经在互联网上搜索了一个解决方案,没有明确的答案或帮助任何真正的地方.它是一个相当“简单”的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%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#,保持:

>字节缓冲区
>图像高度
>图像宽度
>图像Pixeldepth

但是当我尝试在我的C#项目中引用DLL时,我收到以下错误:

Error

我也尝试使用TlbImp.exe工具制作DLL但无济于事.它告诉我DLL不是有效的类型库.

所以我在这里有点失落.我是C的新手,所以制作Interop / COM组件不是我以前做过的,也不是在C#中使用DLL.

解决方法

您不能在.NET项目中引用用C编写的非托管代码库.
因此,要从这样的库中调用代码,您必须使用 DllImport,或使用 WrapperClass.

我提到了这个答案:https://stackoverflow.com/a/574810/4546874.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读