C # - вызов метода из сборки для другого результата в DllNotFoundException - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть 3 сборки, Assembly2 ссылка Assembly1 и Assembly3 ссылка Assembly2.Но вызов метода Assembly2, объявленного в Assembly1 из Assembly3, приводит к DllNotFoundException.

Assembly2 -> Assembly1

Assembly3 -> Assembly2

    extern "C" namespace Assembly1
    {
       __declspec(dllexport) void SomeMethod(){  }
    }

_

    namespace Assembly2
    {
       public static class OtherClass
       {
            [DllImport("Assembly1.dll")]
            public static extern void SomeMethod();
       }
    }

_

    namespace Assembly3
    {
       public static class SomeClass
       {
            public static void SomeOtherMethod()
            {
                OtherClass.SomeMethod(); //DllNotFoundException, Cannot load Assembly1
            } 
       }
    }

Как решить эту проблему?

  • Добавить ссылку от Assembly3 до Assembly1 является единственным решением?

  • Можно ли решить эту проблему слиянием Assembly1 и Assembly2?(Я понятия не имею, это может что-то сломать)

1 Ответ

0 голосов
/ 13 сентября 2018

Ваши опции включают в себя:

  • Объединение всех выходных каталогов проекта; C #: Свойства> Сборка> Выходной путь, C ++: Свойства> Общие> Выходной каталог.
  • Добавить ссылку из Assembly3 в Assembly1 (поскольку это позволяет копировать неуправляемую сборку в тот же выходной каталог)
  • Assembly1.dll должно быть , где-то его можно найти (при условии, что "Assembly1.dll" является просто примером стандартной библиотеки DLL)

Первый вариант, вероятно, самый лучший для вас.

Вероятно, вам больше не понадобится ссылка из Assembly2 в Assembly1. Это не то, что заставляет PInvoke / DllImport работать - это не то же самое, что связывать статическую библиотеку в C ++. PInvoke обрабатывается во время выполнения, а не во время компиляции. Вот почему вы получаете DllNotFoundException во время выполнения вместо «неопределенного символа», как при компиляции / компоновке C ++. Ссылка копирует неуправляемую dll в выходную папку, где ее можно найти.

...