Ссылка на сборку C # отличается от C ++ / CLI DLL - PullRequest
1 голос
/ 28 апреля 2011

Я хочу написать плагин для программного обеспечения, которое загружает обычные 32-битные DLL в качестве плагинов.

Поскольку мой опыт работы с C # намного лучше, я планировал использовать сборку C ++ / CLI в качестве оболочки, которая затем делегируетфункция вызывает реальный плагин C #.

Но у меня есть проблема с этим.Я проверил, что C ++ / CLI DLL загружается правильно.Теперь я добавил сборку C # в качестве ссылки на C ++ / CLI DLL.Проблема в том, что когда у меня есть C # DLL в той же директории, Программное обеспечение хочет загрузить его как плагин напрямую, и Программное обеспечение вылетает.Если я помещаю C # DLL в подкаталог, он не может быть найден C ++ / CLI DLL.

Я попробовал различные решения, которые я нашел в Интернете, чтобы позволить C ++ / CLI Assembly найти C # Assembly в подкаталоге., но все они не работали:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="DLL" />
  </assemblyBinding>
</runtime>

Не работал.Кажется, что app.config игнорируется при создании DLL C ++ / CLI.

Добавление AppDomain.CurrentDomain.AppendPrivatePath("DLL");, поскольку первая команда в сборке не работает, так как DLL имеет только прямые вызовы функций, и ничего подобногореальная «точка входа».

Еще одна вещь, которую я нашел, - это размещение метода Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args) в DLL.Но я не смог заставить компилятор распознать ключевое слово Assembly, хотя я использовал using namespace System::Reflection;.

Так что я был бы благодарен, если кто-нибудь знает, как заставить это работать.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

Возможно, вам не придется использовать 2 сборки (C ++ и C #), если вы используете мой шаблон проекта для неуправляемого экспорта .

Я слышал о некоторых людях, которые писали шаблоны на основе моего для создания сторонних плагинов.
Самый новый, который я видел, был один для Блокнота ++

Edit: Даже если вы создаете простую DLL с C #, вам все равно может понадобиться ссылка на другие сборки. Тем не менее, кажется, что вы можете обойтись с C # довольно хорошо, поэтому вы также можете использовать AssemblyResolve оттуда.

1 голос
/ 28 апреля 2011

Вызовите Assembly::Load(path_to_managed_dll) перед вызовом любых функций, использующих управляемую DLL.

...