2015-10-12 5 views
0

Я хочу динамически загружать dll COM в консольное приложение C#.Загрузить com DLL в C#

До сих пор я попытался следующий код:

// 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.

Может ли кто-нибудь сказать мне, почему код не может динамически загружать dll COM?

, и если нет, можете ли вы рассказать мне, как я могу сделать то же самое.

Спасибо за любое предложение и помощь.

+0

Вам понадобится создать оболочку с помощью [Tlbimp.exe] (https://msdn.microsoft.com/en-us/library/tt0cf3sx%28v=vs.110%29.aspx). – Filburt

+0

COM работает по-другому, чем .NET. Загружается ли TestComDll.dll перед загрузкой? – Dennis

+0

@ Dennis Да, я зарегистрировал 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; 
    } 

Надеется, что это помогает!

Смежные вопросы