BadImageFormatException в C#. Ожидается, что содержит манифест

Я тестировал некоторые вещи с помощью командной строки VS2013 Native Tools.

До сих пор я не мог получить свой код для загрузки созданных мной библиотек.

Вот мой код dll, написанный на c. (На примере MSDN)

int __declspec(dllexport) SampleMethod(int i){return i*-10;} 

И скомпилировал его с cl /LD в родных инструментах VS2013.

Затем я скомпилировал свой код на C# с помощью csc в VS2013 Native Tools.

public class MainClass
{
    static void Main(string[] args)
    {
        Assembly assembly;
        try
        {
            assembly = Assembly.Load(args[0]);
            Console.WriteLine("Loaded dll");
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception caught : \n{0}.", e);
        }
    }    
}

И пойманное исключение выглядит так:

Exception caught :
System.BadImageFormatException: Could not load file or assembly 'test' or one of
 its dependencies. The module was expected to contain an assembly manifest.
File name: 'test'
   at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String cod
eBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark&
stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntro
spection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName as
semblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMar
k& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIn
trospection, Boolean suppressSecurityChecks)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evid
ence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolea
n forIntrospection)
   at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evid
ence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
   at System.Reflection.Assembly.Load(String assemblyString)
   at MainClass.Main(String[] args)

Я пробовал использовать инструменты как x86, так и x64, и теперь у меня нет идей.

1 ответ

Решение

Assembly.Load может загружать только управляемые (.NET) сборки. Вы пытаетесь загрузить нативную DLL, выдающую ошибку.

Вместо этого вы хотите использовать P/Invoke. Это будет работать только для простых методов в стиле C, если вам нужно работать, например, с классами C++, вам сначала нужно создать библиотеку взаимодействия.

Подпись метода P / Invoke для вашего случая будет выглядеть примерно так:

[DllImport("test.dll")]
public static extern int SampleMethod(int i);
Другие вопросы по тегам