У меня есть 64-разрядное приложение VB.Net, которому необходимо использовать 32-разрядную неуправляемую DLL сторонней организации.Невозможно вызвать 32-разрядную неуправляемую DLL из 64-разрядного управляемого кода
Вот вещи, которые я пробовал:
Я создал 32-битную библиотеку vb.net класса обертки, которая называется COM1, и добавил VB.Net COM класс, который вызывает 32-разрядный неуправляемые функции dll. В проекте включен «Регистрация для COM-взаимодействия». Когда я сослалась на 32-битную DLL (COM1.dll) к моему 64-разрядного приложения и выполняется приложение, я получил следующее исключение:
Не удалось загрузить файл или сборку «COM1.dll» .. . Была сделана попытка загрузить программу с неправильным форматом.
Я создал 64-битную библиотеку классов vb.net обертка, которая называется COM2, и добавил VB.Net COM класс, который называет 32-битную DLL неуправляемый. В проекте включен «Регистрация для COM-взаимодействия». Когда я ссылался на 64-разрядную DLL (COM2.dll) в своем 64-битном приложении и выполнял приложение, мне удалось загрузить 64-разрядную dll, но я получил следующее исключение, когда я назвал одну из функций, неуправляемая dll (через 64-разрядную обертку dll):
Попытка загрузить программу с неправильным форматом.
- Я попытался выполнить описанные выше шаги с помощью приложения WCF, где я заменяю COM-оболочку службой WCF, но получаю тот же результат.
Я понимаю, что я не могу назвать 32-разрядную dll непосредственно из своего 64-битного приложения. То, что я пытаюсь сделать, это вызвать 32-разрядную DLL через механизм IPC — в этом случае COM или WCF. Очевидно, я ошибаюсь здесь.
Может ли кто-нибудь дать мне рабочий код или сообщить мне, что я делаю неправильно на вышеупомянутых шагах?
Часть моего кода:
Мой COM класс
<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _ Public Class ComClass1 Public Declare Sub InitializePort Lib "I2CDrvrs" (ByVal I2cAddr As Byte, ByVal evalBoardUsed As Byte) #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "5da6d3a4-848c-42b1-bc7c-4079ec5457b1" Public Const InterfaceId As String = "8de9508b-fda6-496e-bb29-a90dc5282d2c" Public Const EventsId As String = "cfec40ff-fec0-4250-9d72-9d63f1e37d21" #End Region ' A creatable COM class must have a Public Sub New() ' with no parameters, otherwise, the class will not be ' registered in the COM registry and cannot be created ' via CreateObject. Public Sub New() MyBase.New() End Sub End Class
Мой 64-разрядное приложение
Public Function foo() As Boolean Try COM1.ComClass1.InitializePort(2, 2) Catch ex As Exception MsgBox(ex.ToString) End Try Return True End Function
Спасибо за ваш ответ. Я смог создать сервер COM +. Я импортировал свою 32-разрядную .NET-оболочку в Службы компонентов и на панели «Выполняющие процессы», я могу видеть мою службу (установленную как сервер). Но я не уверен, как мне обратиться к моему 64-битовому приложению. – user7176709
Вы ссылаетесь на него так же, как раньше. COM заботится о различиях. –
Я добавил 32-разрядную dll в качестве ссылки. Но я все равно получаю «Исключение BadImageFormat». Кажется, я пытаюсь напрямую вызвать DLL через свое приложение. Есть ли какое-либо свойство, которое мне нужно для установки службы COM? – user7176709