Asp.net вызывает C # уровень вызова Managed C ++ вызывает Native C ++ - PullRequest
4 голосов
/ 27 апреля 2011

Моя структура проекта выглядит следующим образом:

ASP.NET вызов C # вызов уровня Управляемый вызов C ++ Собственный C ++ (я пытаюсь избежать взаимодействия, вот почему управляемый слой c ++) Я написал модульный тест, который тестирует слой C #, и он отлично работает. Когда я пытаюсь запустить страницу asp.net, я получаю: "Could not load file or assembly..." ошибка. Я понял, что когда я копирую, вставьте Native C ++ dll в «Temporary ASP.NET Files» (в соответствующую папку), сайт работает.

Похоже, что Управляемый код C ++ может найти код Native C ++ , только если он находится в той же папке - очевидно, я не могу иметь свою Native dll в временных файлах .

Есть ли способ установить Native в глобальном масштабе (не работает с System32)?

Спасибо за ваши комментарии.

Это сводится к одному варианту:

  1. Это проблема безопасности

Я настроил сервер самостоятельно с помощью кода, и он работает под cassini, но когда я публикую его (для запуска под iis7), я получаю «Не удалось загрузить файл или сборку ....» я использую IIS7 с ApplicationPoolIdentity, интегрированным .net 4 Большое спасибо, Пини.

Ответы [ 3 ]

5 голосов
/ 27 апреля 2011

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

Эта статья блога Загрузка сборок C ++ в ASP.Net может помочь вам - Короче говоря, вам нужнолибо:

  • Установите переменную окружения %PATH% до того, как сборка Managed C ++ попытается загрузить вашу собственную C ++ dll.
  • Используйте атрибут DllImport, чтобы задать путь к dll (неприменимо в вашем случае, так как вы не используете P / Invoke)
  • Вручную загрузите dll C ++ (например, с помощью LoadLibrary) до того, как сборка Managed C ++ попытается загрузить вашу собственную dll C ++.

Я подозреваю, что установка вашей dll на Win SxS также будет работать, но я не знаю достаточно о том, как это работает, чтобы быть уверенным.

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

Вы можете установить переменную пути?

Вы устанавливаете его, перейдя в Свойства «Мой компьютер» / «Компьютер (Windows-PauseBreak)» и затем щелкнув «Дополнительные настройки». Нажмите «Дополнительно». Переменные среды. При необходимости измените «Путь» в системных переменных.

1 голос
/ 05 мая 2011

Мне пришлось перевернуть bool в ApplicationPoolIdentity.Один из полей в свойствах говорит: «включить 32-битную версию», и это сделало свое дело :) по умолчанию - False. Мой сервер - 64-битный, и я строю свой нативный с 32-битной.

...