С++ dll(pure cli) & C#
От: deppp  
Дата: 15.12.09 08:26
Оценка:
Подскажите пожалуйста, как можно использовать С++ dll скомпилированную с опцией CLI:pure (содержащую только managed код) сборкой на C#.
Код самый примитивный, тестовый — в dll есть объявление класса

namespace CPP_Prototype {
   public value class Calculation
   {
      public: 
         int Calculate();
   };
}


и определение

namespace CPP_Prototype {
   int Calculation::Calculate()
   {
       return 42;
   }
}


В С#-экзешнике пытаюсь делать следующее:

  static void Main(string[] args)
  {
      Calculation calc = new Calculation();
      Console.ReadLine();
  }


И получаю в рантайме BadImageFormatException
(Could not load file or assembly 'CPP_Prototype, Version=1.0.3635.33222, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.)

Я ведь не ошибаюсь, можно использовать managed C++-код без DllImport? Технология IJW, все дела...
Re: С++ dll(pure cli) & C#
От: _Eter_ http://mnazarov.ru
Дата: 15.12.09 18:57
Оценка:
Здравствуйте, deppp, Вы писали:

D>Подскажите пожалуйста, как можно использовать С++ dll скомпилированную с опцией CLI:pure (содержащую только managed код) сборкой на C#.

D>Код самый примитивный, тестовый — в dll есть объявление класса
D>....




Я запустил ваш пример, и у меня все заработало.
(Visual Studio 2010 Ultimate beta2)
Re: С++ dll(pure cli) & C#
От: servancho Россия https://dedis.ru
Дата: 15.12.09 19:55
Оценка: 9 (1)
Здравствуйте, deppp, Вы писали:

D>Подскажите пожалуйста, как можно использовать С++ dll скомпилированную с опцией CLI:pure (содержащую только managed код) сборкой на C#.

D>Код самый примитивный, тестовый — в dll есть объявление класса

D>И получаю в рантайме BadImageFormatException

D>(Could not load file or assembly 'CPP_Prototype, Version=1.0.3635.33222, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.)

D>Я ведь не ошибаюсь, можно использовать managed C++-код без DllImport? Технология IJW, все дела...


Так ты битность для C# проекта укажи, Any CPU не катит.
Если руки золотые, не важно из какого места они растут.
Re[2]: С++ dll(pure cli) & C#
От: _Eter_ http://mnazarov.ru
Дата: 16.12.09 10:59
Оценка:
S>Так ты битность для C# проекта укажи, Any CPU не катит.

Работает с target = "Any CPU"

D>(Could not load file or assembly 'CPP_Prototype, Version=1.0.3635.33222, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.)


Сегодня проверил на работе еще в Visual Studio 2008 под .Net Framework. У меня все заработало.
Может вы как-то неправильно создаете проект для C++/CLI (возможно у него неправильные настройки)?

Я пробовал два варианта:
1) Создать CLR Console Application и установить у него "Pure MSIL Common Language Runtime Support (/clr:pure)" и "Dynamic Library (.dll)"
2) Создать обычную Windows DLL и установить те же параметры, так же удалить функцию DllMain

Опишите, пожалуйста, подробнее что вы делали и какую версию фреймфорка использовали
Re[3]: С++ dll(pure cli) & C#
От: deppp  
Дата: 16.12.09 17:01
Оценка:
Здравствуйте, _Eter_, Вы писали:

S>>Так ты битность для C# проекта укажи, Any CPU не катит.


_E_>Работает с target = "Any CPU"


Дело действительно было с битностью, но не в Platform (тут можно оставить Any CPU), а в Platform target (здесь оказывается надо было выставить x86, у меня по умолчанию стояло Any CPU и здесь, а операционка 64битная (Windows 7)

_E_>Сегодня проверил на работе еще в Visual Studio 2008 под .Net Framework. У меня все заработало.

_E_>Может вы как-то неправильно создаете проект для C++/CLI (возможно у него неправильные настройки)?

_E_>Я пробовал два варианта:

_E_>1) Создать CLR Console Application и установить у него "Pure MSIL Common Language Runtime Support (/clr:pure)" и "Dynamic Library (.dll)"
_E_>2) Создать обычную Windows DLL и установить те же параметры, так же удалить функцию DllMain

_E_>Опишите, пожалуйста, подробнее что вы делали и какую версию фреймфорка использовали


Фреймворк 3.5, MS Visual Studio 2008. Но дело, как уже было сказано, оказалось в битности.
Спасибо!
Re[4]: С++ dll(pure cli) & C#
От: servancho Россия https://dedis.ru
Дата: 16.12.09 17:24
Оценка:
Здравствуйте, deppp, Вы писали:

S>>>Так ты битность для C# проекта укажи, Any CPU не катит.


_E_>>Работает с target = "Any CPU"


D>Дело действительно было с битностью, но не в Platform (тут можно оставить Any CPU), а в Platform target (здесь оказывается надо было выставить x86, у меня по умолчанию стояло Any CPU и здесь, а операционка 64битная (Windows 7)


Конечно, чудес не бывает
Есть solution platform и target platform на проjекте, я имел ввиду последнюю.

Info: solution platform это просто конфигурация билда солюшена, т.е. она определяет какие проекты как собирать (или не собирать) при выбранной данной конфигурации. Заметь, ты можешь создать solution platform с любым именем, что весьма удобно
Если руки золотые, не важно из какого места они растут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.