我有一个用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");
}
}
但是所有树实例都是相同的。我想要独立的实例。这可能吗?
答案 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");
}