以这种方式加载:
[DllImport("Rockey3.dll", CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
我只有C#程序的源码,没有这两个dll程序的源码。期待高手解答?
忘记说了,dll是非托管的。
你可以指定调用的时机呀! dll中写main方法有点不科学
dllmain呀,老兄,你不知道有dllmain方法存在么?
忘记说了,dll是非托管的。
@沧海一杰:
//EntryPoint 指定要调用函数名 [DllImport("callback.dll", EntryPoint = "add", SetLastError = true)] //函数名可以和调用c/c++的函数名不一样 public static extern int add1(int a, int b);
只要函数名不一致,先调那个,在调那个,调用顺序还不好控制吗
@秋壶冰月: 其实情形是这样的,C#已经加载了一个dll1(没有完整源码), 在dllmain里调用了一次这个函数,我现在又写了一个dll2, 也在dllmain里调用了这个函数,所调用的函数为初始化函数,后调用无效。因为dll1调用这个函数时参数是有缺陷的,我需要先执行dll2的dllmain,来修复之前遗留的问题。
其实我就是想改变C#加载dll1和dll2的加载顺序?也就是调用LoadLibary的顺序?
@沧海一杰:
1. 可以这样调用
//EntryPoint 指定要调用函数名 [DllImport("callback.dll", EntryPoint = "add", SetLastError = true)] //函数名可以和调用c/c++的函数名不一样 public static extern int add1(int a, int b); //EntryPoint 指定要调用函数名 [DllImport("callback2.dll", EntryPoint = "add", SetLastError = true)] //函数名可以和调用c/c++的函数名不一样 public static extern int add2(int a, int b); private void button1_Click(object sender, EventArgs e) { try { string txt1 = textBox1.Text; string txt2 = textBox2.Text; int sum = add1(Convert.ToInt32(txt1), Convert.ToInt32(txt2)); sum = add2(sum, sum); textBox3.Text = sum.ToString(); } catch (Exception ex) { MessageBox.Show(ex.StackTrace); } }
2. 参数有问题,你在c#中做处理就好了,为什么一定要单独在写一个c/c++的dll呢?