2016-06-02 10 views
-1

У меня в настоящее время возникают проблемы с приложением VB6, которому необходимо кодировать некоторый текст с использованием того же метода кодирования, который доступен в .NET framework 4.5. Я искал в Интернете и нашел некоторые функции, которые пытаются сделать кодировку, основанную на UTF-8, но она все еще не соответствует выходному параметру 4.5.Внешняя DLL в VB6 с пространствами имен

Затем я искал способ импортировать DLL-рамки 4.5 в проект VB6. Это то, что я достиг до сих пор:

Private Declare Function dotNetUrlEncode Lib "System.Web.dll" Alias "UrlEncode" (str As String) As String 

Проблема заключается в том, что метод «UrlEncode» это внутри пространства имен «HttpUtility», «System.Web.HttpUtility.UrlEncode» и используя код выше, я не могу получить доступ к метод. Я попытался изменить его, чтобы выглядеть как код ниже, но проблема не устранена, я не могу достичь метод UrlEncode:

Private Declare Function dotNetUrlEncode Lib "System.Web.dll" Alias "HttpUtility.UrlEncode" (str As String) As String 
Private Declare Function dotNetUrlEncode Lib "System.Web.HttpUtility.dll" Alias "UrlEncode" (str As String) As String 

Есть ли способ достичь метод UrlEncode внутри «System.Web.dll»? Где я иду не так?

Спасибо за помощь!

С уважением.

+0

Возможно, вам захочется заглянуть в COM Callable Wrapper. https://msdn.microsoft.com/en-us/library/f07c8z1c(v=vs.110).aspx – Jeremy

+0

Спасибо, я посмотрю! – Abner

+2

Включение .net - сумасшедший подход. Вы действительно должны найти решение без .net. Не сдавайся так легко! –

ответ

1

Это не сработает. .NET DLL содержал код, для которого требуется среда выполнения .NET. Приложение VB6 не может вызвать этот код. В его процессе не загружается среда выполнения .NET.

Вы можете только импортировать функции из родные DLLs в этом направлении. Именно поэтому он работает для системных DLL, входящих в состав операционной системы.

Лучшим решением было бы действительно ознакомиться с документацией и точно определить, как работает функция UrlEncode. Конечно, внутренности реализации не будут документированы, но это не имеет значения. Все, что вас интересует, это спецификация. Следуйте той же спецификации при реализации своей собственной функции, если вы не можете найти системную функцию, которая имеет эквивалентное поведение.

Если вам абсолютно необходимо вызвать функции .NET из приложения VB 6, это можно сделать. Вам нужно будет создать .NET-оболочку, которая вызывает функцию, предоставляемую инфраструктурой, и предоставляет ее COM-совместимым образом, используя ComVisibleAttribute. Дополнительная информация here, here и here.

+0

Прежде всего, спасибо за внимание! Я посмотрю документацию, но у меня есть еще один вопрос: И если я создаю новую dll с помощью .NET и внутри этой DLL - новый метод, который просто возвращает выходную среду UrlEncode в версии 4.5? Смогу ли я использовать то, что я упомянул выше? – Abner

+0

Предполагая, что вы предпринимаете шаги, необходимые для того, чтобы сборка .NET была видна из приложения COM (VB 6). –

+0

Нет правды. Вы можете использовать, например, UnmanagedExports Роберта Гизеке. Или вы можете обернуть его в сборку смешанного режима C++/CLI. Первое, безусловно, самое простое. Однако приведение .net в процесс - просто сумасшедшая идея! –