在C++Dll中创建要导入C#的方法

本文关键字:方法 导入 C++Dll 创建 | 更新日期: 2023-09-27 17:58:58

在学习了一些小课程并使用了一些WPF和C#之后,我决定重写我一直在开发的应用程序。我在创建并导入到WPF应用程序中的C++DLL中,大多数函数都能完美地工作。

不过,我和他们中的一些人有点麻烦。其中一个是我以前从其他函数传递变量或使用对话和消息框的地方。

下面是我需要放入DLL中的一个C++函数的示例。该函数生成列表框中文件列表的MD5哈希代码,这些文件是通过使用OpenFileDialog添加到列表框中的。

array<Byte>^ Hash()
{
    array<Byte>^ Buffer = nullptr;
    int x = 0;
    for each(String^ Files in listBox2->Items)
    {
        try
        {
            IO::FileStream^ FileStream = gcnew IO::FileStream(Files, IO::FileMode::Open, IO::FileAccess::Read);
            IO::BinaryReader^ BinaryReader = gcnew IO::BinaryReader(FileStream);
            IO::FileInfo^ FileInfo = gcnew IO::FileInfo(Files);
            System::Int64 TotalBytes = FileInfo->Length;
            Buffer = BinaryReader->ReadBytes(safe_cast<System::Int32>(TotalBytes));
            FileStream->Close();
            delete FileStream;
            BinaryReader->Close();
            MD5^ md5 = gcnew MD5CryptoServiceProvider;
            array<Byte>^ Hash = md5->ComputeHash(Buffer);
            String^ FileHex = BitConverter::ToString(Hash);
            listBox3->Items->Add(FileHex);
            x = x + 1;
        }
        catch(Exception^ e)
        {
            MessageBox::Show(e->Message->ToString());
            listBox1->Items->RemoveAt(listBox1->SelectedIndex);
        }
    }
    return Buffer;
}

这段代码在我制作的C++应用程序中运行得很好。因此,我试图做的是获取try语句中的所有内容,并将其用作方法的代码。然而,我的问题来自第一行,其中"Files"显然是一个变量,或者至少我认为这就是问题所在。

有没有办法我仍然可以按原样使用这些代码,并在C#中创建一个变量,然后将其传递给这个方法?

我试图在我的C#应用中使用以下代码来做到这一点

private void button2_Click(object sender, RoutedEventArgs e)
{
    DllTest.Funtions Functions = new DllTest.Funtions();
    foreach (String Files in listBox1.Items)
    {
        String File = Files;
        File = Functions.HashFunction();
        listBox2.Items.Add(File);
    }
}

然而,当我运行应用程序时,我只收到列表框中出现的catch消息。这是当我使用方法"在mscorlib.dll中发生类型为"System.ArgumentNullException"的首次机会异常"时编译器中的错误

我有没有办法在不重写C#中的方法的情况下做到这一点?

很抱歉,如果我的代码不是最好的,我对C++和C#仍然很陌生

在C++Dll中创建要导入C#的方法

咨询我的心理调试器,我确定您希望在C++/CLI:中使用此功能

    String^ HashFunction(String^ filename)
    {
        array<Byte>^ Buffer = IO::File::ReadAllBytes(filename);
        array<Byte>^ Hash = MD5CryptoServiceProvider().ComputeHash(Buffer);
        return BitConverter::ToString(Hash);
    }

这在C#中:

private void button2_Click(object sender, RoutedEventArgs e)
{
    foreach (String filename in listBox1.Items)
    {
        try {
            listBox2.Items.Add(Functions.HashFunction(filename));
        }
        catch (Exception ex) {
            MessageBox.Show(e.Message);
        }
    }
}

但我的心理调试器经常出现故障。

String File = Files;
File = Functions.HashFunction();

上面的代码毫无意义。