在c#中加载一个com DLL

时间:2015-10-12 06:23:29

标签: c# .net dll com

我想在c#console应用程序中动态加载COM dll。

直到现在我尝试了以下代码:

// load exe with args as EXE DllName classNameTobeLoaded
try
{
 // load assembly
 Assembly Dll = Assembly.LoadFile(@"C:\My_Dir\TestComDll.dll");
 // get the type names
 foreach(Type t in Dll.GetExportedTypes())
 {
   dynamic vClassLoaded = Activator.CreateInstance(t,"Test");
   Console.WriteLine("Type Loaded");
 }

  Console.WriteLine("DLL is loaded");
}
catch (Exception ex)
{
  Console.WriteLine("Unable to load a DLL because \n" + ex.Message);
}

但是在加载dll时我收到的错误是:

{System.BadImageFormatException: The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018)
   at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence)
   at System.Reflection.Assembly.LoadFile(String path)
   at ThirdPartyDLLLoader.Program.Main(String[] args) in h:\Test Exe\ThirdPartyDLLLoader\ThirdPartyDLLLoader\Program.cs:line 18}

相同的代码适用于.NET DLL

任何人都可以告诉我为什么代码无法动态加载COM dll吗?

如果不是,请告诉我如何做同样的事。

感谢您的任何建议和帮助。

2 个答案:

答案 0 :(得分:0)

我有一个函数加载类库dll

 public ICollection<Assembly> GetAssemblies(string pathOfDLL)
    {
        List<Assembly> baseAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
        var controllersAssembly = Assembly.LoadFrom(pathOfDLL);
        baseAssemblies.Add(controllersAssembly);
        return baseAssemblies;
    }

希望它有所帮助!

答案 1 :(得分:-1)

这不可能。 Assembly.LoadFrom方法用于加载.NET程序集。必须注册COM库,然后才能使用Activator.CreateInstance方法实例化类。

这是我访问MS Word的方式:

Type type = Type.GetTypeFromProgID("Word.Application");
object obj = Activator.CreateInstance(type);