首页 新闻 会员 周边

c# 动态加载(DllImport)两个dll,哪个dll的dllmain优先执行,有没有办法调整调用顺序?

0
悬赏园豆:10 [已解决问题] 解决于 2018-01-28 19:15

以这种方式加载:

  [DllImport("Rockey3.dll", CharSet = CharSet.Ansi, SetLastError = true, CallingConvention = CallingConvention.StdCall)]

 

我只有C#程序的源码,没有这两个dll程序的源码。期待高手解答?

问题补充:

忘记说了,dll是非托管的。

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2017-12-20 14:41
< >
分享
最佳答案
0

你可以指定调用的时机呀! dll中写main方法有点不科学

收获园豆:10
秋壶冰月 | 大侠五级 |园豆:5903 | 2017-12-20 15:22

dllmain呀,老兄,你不知道有dllmain方法存在么?

空明流光 | 园豆:106 (初学一级) | 2017-12-20 16:53

忘记说了,dll是非托管的。

空明流光 | 园豆:106 (初学一级) | 2017-12-20 16:54

@沧海一杰: 

//EntryPoint 指定要调用函数名
[DllImport("callback.dll", EntryPoint = "add", SetLastError = true)]
//函数名可以和调用c/c++的函数名不一样
public static extern int add1(int a, int b);   

只要函数名不一致,先调那个,在调那个,调用顺序还不好控制吗

秋壶冰月 | 园豆:5903 (大侠五级) | 2017-12-20 17:08

@秋壶冰月: 其实情形是这样的,C#已经加载了一个dll1(没有完整源码), 在dllmain里调用了一次这个函数,我现在又写了一个dll2, 也在dllmain里调用了这个函数,所调用的函数为初始化函数,后调用无效。因为dll1调用这个函数时参数是有缺陷的,我需要先执行dll2的dllmain,来修复之前遗留的问题。

其实我就是想改变C#加载dll1和dll2的加载顺序?也就是调用LoadLibary的顺序?

空明流光 | 园豆:106 (初学一级) | 2017-12-21 16:30

@沧海一杰: 

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呢?

秋壶冰月 | 园豆:5903 (大侠五级) | 2017-12-21 16:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册