Поместите Interll DLL в GAC? - PullRequest
       3

Поместите Interll DLL в GAC?

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

Это может быть немного глупый вопрос, но мне нужно кое-что прояснить. Я несколько новичок в .NET и создал EXE, который должен был ссылаться на существующую COM DLL. При этом Visual Studio 2010 автоматически создала «Interop» DLL, которая ему нужна / используется для работы с устаревшей COM DLL.

Я развернул свой проект и включил в него эту Interop DLL (в той же папке), и все работает нормально. Тем не менее, у меня есть другие приложения, которые должны будут использовать эту же устаревшую COM DLL. Можно ли ссылаться на него одинаково в каждом приложении и продолжать развертывание DLL-библиотеки Interop для каждого приложения? К сожалению, все эти небольшие приложения находятся в одной и той же папке, и каждое из них использует одну и ту же Interop DLL (так что она будет существовать там, если будет использоваться другим приложением). Я вынужден поместить их в одну папку, потому что эти приложения называется как способ настройки родительского приложения. Таким образом, он только смотрит в свою локальную папку, когда хочет запустить «пользовательское» приложение. Я просто обеспокоен тем, что если один EXE-файл когда-либо будет удален и он извлечет Interop DLL, то другие, которые все еще зависят от него, потерпят неудачу.

Итак, мне было интересно, возможно ли или хорошая идея поместить эту Interop DLL в GAC? Я пошел дальше и установил Interop DLL в GAC, а затем удалил Interop DLL из папки, где работает мой EXE, и он не работал. Я получаю сообщение об ошибке «Не удалось загрузить файл или сборку». Я застрял на том, чтобы заставить это работать.

  1. Нужно ли ссылаться на Interop DLL в моем проекте по-другому, так что теперь это из GAC? или
  2. Нужно ли что-то добавить в мой код .NET, например Assembly.Load, чтобы это работало?
  3. Нужно ли создавать эту Interop DLL самостоятельно, используя TLBIMP?

Любая помощь будет принята с благодарностью!

С наилучшими пожеланиями,

Nelson

Ответы [ 2 ]

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

Это называется PIA, "Первичная сборка взаимодействия". Вы генерируете их с параметром / primary для Tlbimp.exe, HowTo здесь .

В некоторых случаях у есть , чтобы иметь PIA, что требуется, когда одна из ваших сборок предоставляет тип из библиотеки импорта другой сборке, которая запускается с отдельной копией загруженной библиотеки взаимодействия. Очевидно, это не ваш случай. Он также идет по пути додо, VS2010 поддерживает функцию «Embed Interop Types», очень желательную функцию, когда важные библиотеки полностью исчезают.

В твоем случае я бы не стал беспокоиться. Нет никакого преимущества в том, чтобы поместить это в GAC, только головные боли. В противном случае не знаете, почему у вас возникли проблемы, используйте Fuslogvw.exe для устранения проблем с разрешением сборки.

0 голосов
/ 07 апреля 2011

Вы можете использовать ILmerge , чтобы создать один файл .dll и развернуть его в GAC.

PS. Если вы используете VS.NET 2010, вы можете использовать свойство проекта Embed Interop types, смотрите здесь .

...