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

时间:2011-06-13 17:08:30

标签: c# dll methods import c++-cli

在学习了一些小课程并使用WPF和C#后,我决定重写我一直在研究的应用程序。我将大多数函数完美地运行在我创建的C ++ DLL中并导入到我的WPF应用程序中。

虽然我和其中一些人有点麻烦。我以前从其他函数传递变量或者使用对话框和消息框。

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

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语句中的所有东西都用作方法的代码然而我的问题来自第一行显然“文件”是一个变量,或者至少我认为它是问题所在。

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

我尝试使用C#app中的以下代码

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);
    }
}

但是,当我运行应用程序时,我只会在列表框中显示捕获消息。当我使用方法“在mscorlib.dll中发生类型'System.ArgumentNullException'的第一次机会异常'时,这是编译器中的错误”

无论如何我可以在不用C#重写方法的情况下做到这一点吗?

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

的新手

2 个答案:

答案 0 :(得分:2)

咨询我的通灵调试器,我已经确定你想在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);
        }
    }
}

但我的通灵调试器经常出现故障。

答案 1 :(得分:1)

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

上面的代码没有任何意义。