Метод не найден int32 system runtime interopservices marshal sizeof 0
В отличие от исполняемых программ, таких как программы с расширением EXE, файлы DLL не могут быть выполнены напрямую, но должны вызываться другим кодом, который уже выполнен. Тем не менее, DLL имеют тот же формат, что и EXE, и некоторые могут даже использовать расширение .EXE. В то время как большинство динамических библиотек заканчиваются расширением .DLL, другие могут использовать .OCX, .CPL или .DRV.
Файлы DLL полезны, потому что они позволяют программе разделять свои различные компоненты на отдельные модули, которые затем могут быть добавлены или удалены для включения или исключения определенных функций. Если программное обеспечение работает таким образом с библиотеками DLL, программа может использовать меньше памяти, поскольку ей не нужно загружать все одновременно.
С другой стороны, если файл .dll прикреплен к исполняемому файлу, который предназначен для повреждения вашего компьютера, возможно, это опасно. Мы рекомендуем вам запустить сканирование вашей системы с инструмент, подобный этому это может помочь выявить любые проблемы, которые могут существовать.
Вот почему обычно, когда вы видите новый файл .dll на вашем компьютере, где-то будет файл .exe.
Убедитесь, что вы сканируете оба вместе, чтобы вам не пришлось беспокоиться о заражении вашего компьютера чем-то плохим.
Программные программы хранят файлы DLL в одной или нескольких папках во время установки. Эти файлы содержат код, который объясняет работу программ.
Некоторые программы также могут устанавливать файлы DLL в несколько папок вне папки Program Files (где установлено большинство программ). Поиск этих DLL-файлов может быть очень трудным, а удаление их может быть опасным.
Обновлено ноябрь 2021 г .:
Мы рекомендуем вам попробовать этот новый инструмент. Он исправляет множество компьютерных ошибок, а также защищает от таких вещей, как потеря файлов, вредоносное ПО, сбои оборудования и оптимизирует ваш компьютер для максимальной производительности. Это исправило наш компьютер быстрее, чем делать это вручную:
(опциональное предложение для Reimage - Cайт | Лицензионное соглашение | Политика конфиденциальности | Удалить)
Запустить SFC
Для этого щелкните правой кнопкой мыши кнопку «Пуск» на компьютере Windows 10, чтобы открыть меню WinX, и щелкните ссылку «Командная строка (администратор)».
В окне CMD скопируйте следующую команду и нажмите Enter:
Сканирование может занять 10 минут, и если оно успешно завершено, вы должны перезагрузить компьютер. Запуск sfc / scannow в безопасном режиме или при запуске может дать лучшие результаты.
Обновить драйверы
Обновите драйверы вашего устройства, чтобы увидеть, решит ли это проблему.
Восстановление при загрузке
Хотя эта проблема встречается реже, потенциально гораздо более серьезная проблема заключается в том, что библиотеки DLL, которые вы загружаете из источников, отличных от поставщика, иногда могут быть загружены вирусами или другими вредоносными программами, которые могут заразить ваш компьютер. Это особенно верно для веб-сайтов, которые не слишком заботятся о том, откуда берутся их файлы. И это не так, как будто эти сайты сделают что-нибудь, чтобы рассказать вам о своих источниках высокого риска.
Windows Server 2016 Минимальные требования к оборудованию
Windows Server 2016 - это серверная операционная система, разработанная Microsoft как часть семейства операционных систем Windows NT, разработанная одновременно с Windows 10. Windows Server 2016 был выпущен в сентябре на конференции Microsoft Ignite и стал общедоступным на Octo.
Это проблема, которая может возникнуть, когда есть старая версия DLL еще витает где-то вокруг. Убедитесь, что развернуты последние сборки и в определенных папках не скрыты дублированные старые сборки. Лучше всего было бы удалить каждый встроенный элемент и перестроить/повторно развернуть все решение.
Неправильная Версия Пакета Nuget
У меня был проект модульного тестирования, который тянул в наших компаниях пакет доступа к данным EF Nuget, и эта версия была путь за текущей версией.
параметры Nuget для указанного пакета были установлены в least version для тех другие пакеты которые были зависимыми пакетами второго уровня.
отсюда молча получил неправильную версию для ассамблеи.
решение
установив / обновив пакет в Nuget до [get] последние Исправлена проблема.
Я только что столкнулся с этим в проекте .NET MVC. Основной причиной были конфликтующие версии пакетов NuGet. У меня есть решение с несколькими проектами. Каждый из проектов имел несколько пакетов NuGet. В одном проекте у меня была версия пакета семантического ведения журнала Enterprise Library, а в двух других проектах (которые ссылаются на первый) у меня были более старые версии того же пакета. Все это компилируется без ошибок, но это дало загадочную ошибку" метод не найден", когда я попытался использовать пакет.
исправление состояло в том, чтобы удалить старые пакеты NuGet из двух проектов, так что он был включен только в один проект, который действительно нуждался в нем. (Также я сделал чистую перестройку всего решения.)
У меня это случилось со мной с файлом, на который ссылается та же сборка, а не отдельная dll. Как только я исключил файл из проекта, а затем включил его снова, все сработало нормально.
при разработке с вашим собственным сервером NuGet убедитесь, что все версии сборки одинаковы:
также.. попробуйте "очистить" свои проекты или решение и перестроить снова!
Проверьте свои ссылки!
убедитесь, что вы последовательно указываете на те же сторонние библиотеки (не просто доверяйте версиям, посмотрите на путь) в ваших проектах решений.
например, если вы используете iTextSharp V.1.00.101 в одном проекте и вы NuGet или ссылка iTextSharp v1.00.Где-то еще вы получите эти типы ошибок выполнения, которые каким-то образом просачиваются в ваш код.
Я изменил свою ссылку на iTextSharp во всех 3 проекты указывают на одну и ту же DLL, и все работает.
У меня только что была эта проблема, и оказалось, что это потому, что я ссылался на предыдущую версию DLL из моего проекта UI. Поэтому при составлении он был доволен. Но при запуске он использовал предыдущую версию DLL.
Проверьте ссылки на все другие проекты, прежде чем предполагать, что вам нужно перестроить/очистить/повторно развернуть свои решения.
У меня был аналогичный сценарий, когда я получал это же исключение. У меня было два проекта в моем решении для веб-приложений, названных, например, DAL и DAL.Кустспек. Проект DAL имел метод с именем Method1, но DAL.CustSpec не. Мой основной проект имел ссылку на проект DAL, а также ссылку на другой проект под названием AnotherProj. Мой основной проект сделал вызов Method1. В проекте AnotherProj была ссылка на DAL.Проект CustSpec, а не Проект даль. Конфигурация сборки имела как DAL, так и DAL.Проекты CustSpec, настроенные для построения. После того, как все было построено, мой проект веб-приложения имел сборки AnotherProj и DAL в своей папке Bin. Однако, когда я запустил веб-сайт, временный ASP.NET папка для сайта имела даль.По какой-то причине сборка CustSpec в своих файлах, а не сборка DAL. Конечно, когда я запустил часть, которая вызвала Method1, я получил ошибку "метод не найден".
Я думал, что поделюсь этим, если это поможет кому-то еще в будущем.
Я решил эту проблему, сделав стеллаж с моими изменениями и запустив TFS Power Tools 'scorch' в моей рабочей области (https://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f) - . Затем я снял изменения с полки и перекомпилировал проект. Таким образом, вы очистите любые "висячие вечеринки", которые могут быть в вашем рабочем пространстве, и запуститесь со свежим. Это требует, конечно, что вы используете TFS.
в моем случае это была проблема копирования/вставки. Я как-то закончил с частным конструктором для моего профиля отображения:
(обратите внимание на отсутствующую "публику" перед ctor)
который скомпилирован отлично, но когда AutoMapper пытается создать экземпляр профиля, он не может (конечно!) найдите конструктор!
Использование Costura.Fody 1.6 & 2.0:
Потратив кучу времени на изучение этой же ошибки со всеми другими потенциальными решениями, которые не работают, я обнаружил, что более старая версия DLL, которую я внедрял, находилась в том же каталоге, в котором я запускал свою новую компиляцию .exe из. По-видимому, сначала он ищет локальный файл в том же каталоге, а затем заглядывает внутрь своей встроенной библиотеки. Удаление старой DLL работало.
чтобы быть ясным, это было не то, что моя ссылка указывала для старой DLL это было то, что копия старой DLL была в каталоге, в котором я тестировал свое приложение из отдельной системы от той, на которой она была скомпилирована.
Это произошло со мной с помощью MVC4, и я решил после чтения этого потока переименовать объект, который бросал ошибку.
Я сделал чистку и перестроил и отметил, что он пропускает два проекта. Когда я перестроил один из них, произошла ошибка, когда я начал функцию и не закончил ее.
Итак, VS ссылался на модель, которую я переписал, не спрашивая меня, хочу ли я это сделать.
на всякий случай, если это кому-то поможет, хотя это старая проблема, моя проблема была немного странной.
У меня была эта ошибка при использовании Дженкинс.
в конечном итоге выяснилось, что системная дата была вручную установлена на будущую дату, что привело к компиляции dll с этой будущей датой. Когда дата была возвращена к нормальной, MSBuild интерпретировал, что файл был новее и не требовал перекомпиляции проекта.
я столкнулся с этой проблемой, и для меня это был один проект, который использовал список, который был в Примере.Пространство имен Sensors и другой тип реализовали интерфейс ISensorInfo. Класс Type1SensorInfo, но этот класс был на один слой глубже в пространстве имен в Примере.Аппаратура наблюдения.Тип1. При попытке десериализовать Type1SensorInfo в список он выдал исключение. Когда я добавил, используя пример.Аппаратура наблюдения.Type1 в интерфейс ISensorInfo, больше никаких исключений!
У меня было то же самое, когда у меня было несколько процессов MSBuild, запущенных в фоновом режиме, которые эффективно разбились (у них были ссылки на старые версии кода). Я закрыл VS и убил все процессы MSBuild в Process explorer, а затем перекомпилировал.
У меня был тестовый проект, который ссылается на 2 других проекта, Каждый из которых ссылается на разные версии (в разных местах) одной и той же dll. Это смутило компилятор.
в моем случае spotify.exe использовал тот же порт, который мой проект Web api хотел использовать на машине разработки. Номер порта был 4381.
Я ушел из Spotify, и все снова сработало хорошо:)
также возможно, что проблема заключается в параметр или тип возврата метода, который, как сообщается, отсутствует, и" отсутствующий " метод как таковой в порядке.
У меня была эта проблема, когда метод требовал параметра, который я не указывал
в моем случае не было никакого изменения кода вообще, и внезапно один из серверов начал получать это и только это исключение (все серверы имеют один и тот же код, но только у одного начались проблемы):
проблема, я считаю, была повреждена AppPool - мы автоматизировали apppool рециркуляции происходит каждый день в 3 утра, и проблема началась в 3 утра, а затем закончилась сама по себе в 3 утра на следующий день.
В большинстве случаев вы можете описать и использовать структуру без знания о том, как она реализована — особенно как расположены в памяти ее поля. Если вы должны создать структуру для использования ее другими приложениями, или сами должны использовать чужую структуру, то в этом случае вопросы памяти становятся важными. Как вы думаете, каков размер следующей структуры?
Разумный ответ — 8 байт, просто сумма размеров всех полей. Однако если вы попытаетесь узнать размер структуры:
Для работы вам понадобится ссылка на InteropServices:
Для ручного расположения полей в памяти используется атрибут StructLayout. Например:
Это заставляет компилятор располагать поля последовательно, в порядке объявления, что и делает по умолчанию. Другими значениями атрибута являются значение Auto, которое позволяет компилятору самому определять порядок размещения полей, и значение Explicit, которое позволяет программисту указать размер каждого поля. Тип Explicit часто используется для последовательного расположения без упаковки, но в большинстве случаев проще использовать параметр Pack. Он сообщает компилятору о том, сколько должно выделяться памяти и как должны быть выровнены данные. Например, если вы укажете Pack=1, тогда структура будет организована таким образом, что каждое поле будет находиться в границах одного байта и может быть считано побайтно — т.е. никакого упаковывания не требуется. Если вы измените объявление структуры:
… то обнаружите, что теперь структура занимает ровно 8 байт, что отвечает последовательному расположению полей в памяти без дополнительных «упаковывающих» байт. Именно таким образом нужно работать с большинством структур, объявленных в Windows API и C/C++. В большинстве случаев вам не придется использовать другие значения параметра Pack. Если вы установите Pack=2, тогда обнаружите, что структура станет занимать 10 байт, потому что будет добавлено по одному байту к каждому однобайтовому полю, чтобы данные могли читаться кусками по 2 байта. Если установить Pack=4, размер структуры увеличится до 12 байт, чтобы структура могла быть прочитана блоками по 4 байта. Дальше значение параметра перестанет учитываться, потому что размер Pack игнорируется, если он равен или превышает выравнивание, использующееся в данном процессоре, и составляющее 8 байт для архитектуры Intel. Расположение структуры в памяти при разных значения Pack показано на рисунке:
Стоит также упомянуть, что может изменить способ упаковки структуры, изменяя порядок полей в ней. Например, при изменении порядка полей на:
… структуре не понадобится упаковка, она и так займет ровно 8 байт.
Если быть точным
Если вам нужно точно указать, сколько памяти будет выделено для каждого поля, используйте тип расположения Explicit. Например:
Этот код выдаст ошибку. Если вам нужен массив длиной 10 байт, вот один из способов:
Для доступа к массиву придется воспользоваться арифметикой на указателях, что является unsafe кодом. Чтобы под структуру было выделено фиксированное количество байт, используйте параметр Size в атрибуте StructLayout:
Вызовы API
В качестве примера структуры, которая требует выравнивания, мы можем использовать функцию EnumDisplayDevices, которая определена следующим образом:
Структура DISPLAY_DEVICE определена так:
Обратите внимание на использования параметра Size для указания места, необходимого для хранения поля DeviceKey. Теперь если использовать эту структуру при вызове функции:
В этом случае при вызове библиотечной функции поля передаются путем создания неуправляемых массивов нужной длины внутри копии структуры, которая и передается в вызов. Когда функция завершает свою работу, неуправляемые массива конвертируются в управляемые символьные массивы и ссылки на них присваиваются полям структуры. В результате, после вызовы функции вы обнаружите, что структура содержит массива нужного размера, заполненные данными.
В случае вызова функций сторонных библиотек, использование кастомного маршалинга является лучшим решением, поскольку при этом используется безопасный код. Хотя вызов сторонних функций с помощью p/Invoke и не является безопасным в общем смысле.
Сериализация структур
Теперь, после того как мы рассмотрели довольно сложные вопросы, связанные с размещением структур в памяти, самое время узнать, как получить все байты, составляющие структуру. Иными словами, как сериализовать структуру? Существует много способов сделать это, чаще всего используется метод Marshal.AllocHGlobal для выделения памяти в куче под неуправляемый массив. После этого все делается функциями, работающими с памятью, такими как StructToPtr или Copy. Пример:
Фактически, надобность в стольких действиях отсутствует, проще переместить байты структуры напрямую в байтовый массив без использования промежуточного буфера. Ключевым объектом в этом способе является GCHandle. Он возвратит хэндл Garbage Collector'а, и вы можете использовать метод AddrOfPinnedObject для получения стартового адреса структуры. Метод RawSerialize может быть переписан следующим образом:
Этот способ проще и быстрее. Вы можете использовать эти же методы для десериализации данных из байтового массива в структуру, однако более полезно будет рассмотреть решение проблемы чтения структуры из потока.
Чтение структур из потоков
Функция, которая будет читать любой поток, и возвращать структуру, может быть написана без использования обобщений:
Для передачи данных здесь используется GCHandle. Новое в этом коде — использование параметра, указывающего на тип структуры. К сожалению, нельзя использовать этот тип для возвращаемого значения, поэтому после вызова функции необходимо преобразовать ее результат:
Если мы хотим избежать преобразования, тогда нужно использовать обобщенный метод:
Обратите внимание, что теперь мы должны преобразовать объект, возвращаемый методом PtrToStructure, в самом методе, а не в месте вызова, который теперь выглядит следующим образом:
Приятно наблюдать, насколько лучше выглядит использование обобщенного метода.
Ручной маршалинг
Маршалинг так хорошо работает в подавляющем количестве случаев, что можно вообще забыть о его существовании. Однако если вы сталкиваетесь с чем-то необычным, вы можете удивиться, что происходит, когда маршалинг перестает работать. Например, некоторым API вызовам нужно передавать указатель на указатель на структуру. Вы уже знаете, как передать указатель на структуру — это просто передача по ссылке — и поэтому вам может показаться, что передать указатель на указатель тоже просто. Однако все сложнее, чем вы ожидаете. Давайте посмотрим.
В функции AVIFileCreateStream два последних параметра передаются как указатели на IntPtr и структуру соответственно:
Для вызова это функции вы бы написали:
Основываясь на предыдущих примерах, кажется более легким изменить передачу указателя на структуру самим указателем. Казалось бы, что может быть неверного в следующем объявлении:
Однако если вы попытаетесь передать адрес закрепленной (pinned) структуры:
… то увидите ошибку.
Причина этой ошибки заключается в том, что хотя вы и передаете указатель на адрес начала структуры, эта структура располагается в управляемой памяти, а неуправляемый код не может получить к ней доступ. Мы забываем о том, что стандартный маршалинг делает еще кое-какую работу при создании указателей. Перед тем, как создать указатели, для всех параметров, передаваемых по ссылке, создаются полные копии в неуправляемой памяти. После окончания вызова данные из неуправляемой памяти копируются обратно в управляемую.
Написать подобную функцию, которая делает работу маршалинга, нетрудно и очевидно полезно:
Тут просто возвращается IntPtr на область в куче, которая содержит копию данных. Единственный неприятный момент заключается в том, что нужно помнить об освобождении выделенной памяти:
Приведенный код работает в точности как стадартный маршалинг. Однако не забудьте, что lpstruct передается по значению как integer. Для того чтобы скопировать результат обратно в структуру, понадобится еще один метод:
Теперь, после того как мы реализовали ручной маршалинг указателя в структуру, нам нужно получить указатель на указатель на структуру. К счастью, нам не потребуется писать нового кода, потому что наша функция преобразования структуры в указатель может преобразовывать любой тип данных в неуправляемый указатель — включая и сам указатель.
В качестве примера возьмем функцию AVISaveOption, т.к. она принимает два указателя на указатель в качестве параметров:
Фактически параметр ppavi — это указатель на хэндл (который в свою очередь является указателем), а ppOptions — указатель на указатель на структуру. Для вызова этого метода нам понадобится структура:
Определение этой структуры можно посмотреть в документации по стандарту AVI. На следующем шаге нам нужно получить маршализованный указатель на структуру:
… а затем указатель на указатель:
… а за ним указатель на хэндл:
Теперь вызов функции:
… где остальные параметры не представляют интереса, сведения о них могут быть найдены в документации.
Обратите внимание, нужно использовать указатель на саму структуру, а не указатель на указатель! Ну и в конце освобождаем память:
Ошибка при соединение с 1С при получении списка документов на ТСД. Промежуточная база соединяется с базой 1С нормально.
3; 11; 06.03.2017 16:56:38.963 ERROR
MESSAGE: Неизвестное имя. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) at Cleverence.Connectivity.OneC.OneC_8_Connector.DoInvokeMethod(String methodName, Object[] args) at Cleverence.Connectivity.OneC.OneC_8_Connector.InvokeMethod(String methodName, Object[] args) at Cleverence.Connectivity.ConnectivityManager.InvokeMethod(String methodName, Object[] args) at Cleverence.Warehouse.ServerEvents.Invoke(String methodName, Object[] args, DeviceInfo dInfo, Boolean& isDemo) at Cleverence.Warehouse.DataStorage.GetServerHostedDescriptions(String docTypeName, String deviceInfoString) Версия и конфигурация 1С, и режим работы (Файловы или Серверный):Ответы 13
Добрый день,
Судя по логу функция не найдена которая вызывается.
Проверьте что подключение к нужной базе в коннекторе, что обработка драйвера верно указана. Функция должна быть помечена Экспорт.
Уточните версию 1С, название и версию конфигурации.
1С:Предприятие 8.3 (8.3.8.2054)
Серверная база tsd - это промежуточная база драйвера?
У Вас в настройках подключения не указана обработка драйвера. Коннектор вызывает функции из модуля указанной обработки.
tsd - это промежуточная база.
установил в обработку драйвера ВнешниеВызовыУТиУПП .
И вот результат:
MESSAGE: Не удалось создать обработку ВнешниеВызовыУТиУПП
at Cleverence.Connectivity.OneC.OneC_8_Connector.Initialize() at Cleverence.Connectivity.ConnectivityManager.InvokeMethod(String methodName, Object[] args) at Cleverence.Warehouse.ServerEvents.Invoke(String methodName, Object[] args, DeviceInfo dInfo, Boolean& isDemo) at Cleverence.Warehouse.DataStorage.GetServerHostedDescriptions(String docTypeName, String deviceInfoString) MESSAGE: Exception has been thrown by the target of an invocation. at Cleverence.Connectivity.OneC.OneC_8_Connector.Initialize() MESSAGE: Ошибка инициализации модуля: Обработка.ВнешниеВызовыУТиУППЯ подозреваю, что это из-за того что из-за того что база располагается на сервере.
У Вас платформа Mobile Smarts установлена на сервер? Если подключаетесь к серверу с другого ПК и на нем должна быть одинаковая версия платформы и 1С.
Если платформа установлена, проделайте:
Запустите cmd.exe от администратора и не важно если Вы админ на пк, запуск именно правой кнопкой мыши! - запуск от имени .
1) Запустите из командной строки команды: 1cv8.exe /RegServer и regsvr32
comcntr.dll из папки 1С\bin (пример расположения папки: C:\Program Files
(x86)\1cv82\8.2.19.83\bin)
2) Запустите с правами администратора
файл "Зарегистрировать COM.bat" из папки C:\Program Files
(x86)\Cleverence Soft\Mobile SMARTS\Connectivity
3) Перезапустите службу драйвера. Запустите Mobile Smarts, нажмите "Настройки локального
сервера", выберите ваш сервер. Затем нажмите на кнопку "Остановить
сервер данных", затем "Запустить сервер данных"
4) Переподключите промежуточную базу "C:\ProgramData\Cleverence\Базы Mobile SMARTS\1С
Драйвер ТСД Wi-Fi ПРОФ\OnlineConnection\1CBaseSelector.exe"
Получилось при условии, что промежуточная база должна быть файловой.
Если указываешь, что промежуточная база на сервере, то выдает следующие ошибки.
Читайте также: