2015-10-12 91 views
0

我想在c#console應用程序中動態地加載一個COM dll。在c中加載一個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嗎?

如果不是,你可以告訴我怎樣才能做到這一點。

感謝您的任何建議和幫助。

+0

您必須使用[Tlbimp.exe](https://msdn.microsoft.com/en-us/library/tt0cf3sx%28v=vs.110%29.aspx)創建包裝。 – Filburt

+0

COM的工作方式與.NET不同。 TestComDll.dll在加載之前註冊了嗎? – Dennis

+0

@丹尼斯是的我已經在加載之前註冊了dll –

回答

-1

這是無法完成的。 Assembly.LoadFrom方法用於加載.NET程序集。 COM庫必須註冊,然後可以使用Activator.CreateInstance方法實例化類。

這是我如何訪問MS Word中:

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

什麼是'CreateObject'方法?你能提供一個鏈接嗎? – Dennis

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; 
    } 

希望它能幫助!