从非托管DLL(VB Dll)到c#代码提取方法名称

时间:2012-04-02 11:39:34

标签: c# .net dll

我正在编写一个用户必须浏览要使用的dll的应用程序。然后,如果该dll不包含所需的方法定义,则会显示错误消息。我使用了以下代码:

    private void CheckDll()
    {
        string dllName;
        string methodName;
        bool isMethodFound = false;
        OpenFileDialog browseFile = new OpenFileDialog();
        browseFile.Filter = "DLL : |*.dll;*.DLL |OCX Files| *.ocx|All File|*.*";
        try
        {
            if (browseFile.ShowDialog() != DialogResult.Cancel)
            {
                methodName = CommonMod.GetMethodName(1);
                dllName = browseFile.FileName;
                Assembly loadedDll = Assembly.LoadFile(dllName);
                foreach (Type memberType in loadedDll.GetTypes())
                {
                    if (memberType.IsClass)
                    {
                        MethodInfo method = memberType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public);
                        if (method != null)
                        {
                            isMethodFound = true;
                        }

                    }

                }
                if (!isMethodFound)
                {
                    MessageBox.Show(methodName + " method not found in DLL.", "Script Generator", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
            Debug.Print(e.Message);

        }
    }
}

}

这适用于.net DLL,但是使用VB DLL它失败了,有没有办法为vb DLL做到这一点。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

Com组件带有类型库,类似于该特定组件的接口。

您可以使用TypeLibConverter.ConvertTypeLibToAssembly创建互操作,然后以正常方式使用反射。

请参阅msdn

上的示例

您必须检查dll是否是com组件或.net程序集。 一个例子是以下链接

How to determine whether a DLL is a managed assembly or native (prevent loading a native dll)?

答案 1 :(得分:0)

您正在使用反射,它只适用于.NET dll。对于常规DLL,我认为您正在寻找Win32调用LoadLibraryGetProcAddress