C#导入C ++ Unmanaged dll并从一个dll创建多个实例?

时间:2013-04-14 18:30:54

标签: c# c++ pinvoke

我有一个用C ++编写的非托管dll,它有一个简单的功能。

int temp =0;
int func1(void)
{
    return temp +=2;
}

和导出的函数是

UNMANAGED_DLL1_API int recepret(void)
{
    return func1();
}

然后我有一个导入这个dll的C#项目。我想要做的是创建一个导入DLL并从另一个类创建实例的类。

class DllClass
    {
        public int classval;

        [DllImport("unmanaged_dll1.dll", EntryPoint = "recepret", CharSet = CharSet.Unicode)]
        public static extern int recepret();

        public int func1()
        {
            return recepret();
        }
}

并在表单应用程序中

public partial class Form1 : Form
{
    DllClass dll1 = new DllClass();
    DllClass dll2 = new DllClass();
    DllClass dll3 = new DllClass();
private void button1_Click(object sender, EventArgs e)
    {
        richTextBox1.AppendText( "dll1 " +  dll1.func1().ToString()+ "\r\n");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        richTextBox1.AppendText("dll2 " + dll2.func1().ToString() + "\r\n");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        richTextBox1.AppendText("dll3 " + dll3.func1().ToString() + "\r\n");
    }
}

但是所有树实例都是相同的。我想要独立的实例。这可能吗?

1 个答案:

答案 0 :(得分:1)

你有一个全局变量。每个模块实例只有一个实例。每个进程都有一个本机DLL模块实例。使用全局变量不是解决方案。

如果你想让每个按钮点击一个不同的变量,你需要为每个变量创建一个单独的变量。

变量由C#代码拥有更有意义。

您的C ++代码如下所示:

void func1(int &value)
{
    value +=2;
}

然后在C#中你这样称呼它:

[DllImport("unmanaged_dll1.dll")]
public static extern void func1(ref int value);

....

int button1counter = 0;

private void button1_Click(object sender, EventArgs e)
{
    dll1.func1(ref button1counter);
    richTextBox1.AppendText( "dll1 " +  button1counter.ToString()+ "\r\n");
}
相关问题