Как собственную dll вставить в системные файлы?

Такой вопрос: каким образом можно установить dll-библиотеку на устройство так, что бы она работала не находясь в одной паке с программой (как, например, работаю библиотеки Microsoft.NET по типу System.Windows.Forms.dll и т.д.). Цель: создание exe-шника для установки библиотеки. С помощью System.IO.Directory.Move можно перенести данные, в C:\Windows\Microsoft.NET\assembly\GAC_MSIL для каждого объекта предусмотренная папка с версией, например C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089 и если я хочу создать свою папку C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Sqrt\'здесь должна быть версия' то как поступить?

Если есть другие способы работы, только приветствую.

Нашёл следующую информацию: "Если этот dll файл предназначен для использования многими программами, его следует скопировать в системную папку операционной системы C:\\Windows\\System32.

После копирования dll файла в системную папку, его необходимо зарегистрировать в реестре, чтобы каждая программа знала, что такой файл имеется. Зарегистрировать dll файл можно несколькими способами, но мы рассмотрим только самый простой. За регистрацию dll файлов отвечает сервер регистрации утилита regsvr32.exe. Самый простой способ зарегистрировать dll файл заключается в следующем: необходимо в строке «Поиск» в меню «Пуск» набрать название утилиты и полное название регистрируемой dll через пробел «regsvr32 filename.dll», после чего нажать «Enter» и посмотреть результат регистрации dll в появившемся окошке.

Для Windows 64 регистрация dll файла будет немного отличаться. Все из-за того, что в Win64 имеется еще одна системная папка с файлами dll «C:\\Windows\\SysWOW64». Для регистрации dll файла в 64-х разрядной Windows необходимо вместе с названием утилиты regsvr32.exe указывать и полный путь расположения регистрируемого dll файла «regsvr32.exe C:\\Windows\\SysWOW64\\filename.dll»."

Но выдаёт ошибку (в обоих случаях) с моей библиотекой на PascalABC.Net

Возможно я не правильно написал библиотеку, хотя в коренной папку PABCWork.NET всё отлично работает.

Надо добавить ее в GAC командой gacutil /i Sqrt.dll

https://msdn.microsoft.com/ru-ru/library/ex0ss12c(v=vs.110).aspx

"/i assemblyPath Устанавливает сборку в глобальный кэш сборок. "

Да такая команда есть, но выдаёт ошибку:

Моя библиотека лежит и в system32 и в SysWOW64, но не работает.

Да, надо задать строгое имя и подписать сборку:

sn -k keyPair.snk sn -Vr Sqrt.dll sn -R Sqrt.dll KeyPair.snk sn -Vu Sqrt.dll

а потом gacutil /i Sqrt.dll

1 лайк

Эта информация по подписи сборки не достоверна. Сначала я создал пару ключей, но вот уже с -Vr (проверкой регистрации) пошла ошибка:

Далее, перейдя на сайт, я нашёл, что сохранять пару ключей можно в двух файлах: с открытым и закрытым ключёй, а ещё создавать какой-то контейнер для этих же ключей. Но это не помогло разобраться полностью. Так и не заработала.

Да, вспомнил. В сборку надо зашивать хеш публичного ключа. Но в языке нет ключей компиляции для этого.

Спасибо за консультацию! Хоть пока нет ключа компиляции, но я, по крайней мере, не буду пытаться найти способ. Но мне кажется вполне хватит поместить мою dll в рабочую папку PABCWork.NET, и будет работать. Так же возможно будет работать, если на диск C: скинуть (он же считается как папка при поиске dll?). Мне бы хотелось избавиться от привязаности dll к папке с программой, которую она использует. Буду пока довольствоватся тем, что есть.

Случайно нашёл такую тему, странствуя в DLL библиотеках:

Здесь описываются классы для регистрации сборок. Возможно поможет для развития темы. p.s. Это не все классы, если включить аннотации и написать System.Reflection.. то вылезут подсказки, в которых есть другие классы. p.p.s (system.messaging тут не причём)