使用C /CLI包装器DLL时缺少功能

Missing Function while using C++/CLI wrapper dll

本文关键字:功能 DLL CLI 包装 使用      更新时间:2023-10-16

我正在编写一个C /CLI包装器,用于在Visual Basic Project中使用一些UMNMAN的C 代码。这是代码

    #pragma once
    #include "E:ARDUINO DLLUnManagedSystemProfileUnManagedSystemProfileSystemProfile.h"
    #include "E:ARDUINO DLLUnManagedSystemProfileUnManagedSystemProfileSystemProfile.cpp"
using namespace System;
namespace MSystemProfile {
public ref class SystemProfile
{
            SysProfileInterface * System;
public:
    SystemProfile();
 enum class  ConversionDirection:int
    {
        FORWARD,
        REVERSE
    };
    enum class MemoryUnits:int
    {
        BYTE,KB,MB,GB
    };
    double getVolume();
    void   setVolume(float volume);
    void   setScreenBrightness(int brightnessvalue);
    int    getCurrentBatteryLife();
    bool   isLowOnPower();
    bool   isCharged();
    bool   isCharging();
    bool CheckFreeSpace(LPCTSTR lpDirectoryName);
    DWORD64 getFreeSpaceAvailable(LPCTSTR lpDirectoryname);
    DWORDLONG totalVirtualMemory();
    DWORDLONG usedVirtualMemory();
    SIZE_T myVirtualMemoryUse();
    DWORDLONG totalRam();
    DWORDLONG usedRam();
    SIZE_T myRamUse();

    float BtoKB(float   data, MemoryUnitConverter::ConversionDirection  direction);
    float BtoMB(float   data, MemoryUnitConverter::ConversionDirection  direction);
    float BtoGB(float  data, MemoryUnitConverter::ConversionDirection   direction);
    float KBtoMB(float data, MemoryUnitConverter::ConversionDirection   direction);
    float KBtoGB(float  data,MemoryUnitConverter::ConversionDirection   direction);
    float MBtoGB(float  data, MemoryUnitConverter::ConversionDirection   direction);
    float convertTo(MemoryUnitConverter::MemoryUnits sourceunit,MemoryUnitConverter::MemoryUnits destinationunit, float data);


};
}

中有两个函数,即

bool CheckFreeSpace(LPCTSTR lpDirectoryName);
    DWORD64 getFreeSpaceAvailable(LPCTSTR lpDirectoryname);

当我构建它们并反对视觉基本项目时,以下错误出现

错误图像

它说错误3'CheckFreespace'具有不支持的返回类型或不支持的参数类型。

我知道也许VB.NET不支持LPCTRSTR类型,但是现在我该如何解决此问题。

另一个问题是,如果C /CLI支持 lpctrstr 那么为什么不vb.net。

预先感谢您。

类型LPCTSTR是Microsoft创建的C/C 类型,用于Windows API。由于C /CLI是C 代码,并具有托管扩展,因此CANS可以解决LPCTSTR类型而无需错误。但是,vb.net是托管代码,罐子"请参阅"仅包括lpctstr。

的托管类型

要将参数传递到/到未管理的代码,您可以使用 Marshalas 属性。在vb.net中,函数声明为:

<DllImport("<your's dll>", CharSet := CharSet.Unicode, SetLastError := true)>
 Friend Shared Function CheckFreeSpace(<MarshalAs(UnmanagedType.LPCStr)> lpDirectoryName as string) As <MarshalAs(UnmanagedType.U1)> Boolean;

您可以在此处阅读有关编组的更多信息。

i通过将参数作为system :: string和汉斯所说的函数以system ::的函数为单位解决了问题c。str()功能在其中获得一个char*。另外,我将角色集更改为多重材料以解决问题。