我正在编写一个用户必须浏览要使用的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做到这一点。 提前谢谢。
答案 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调用LoadLibrary和GetProcAddress