1 2 3 ► |
|
| ||
Гений 1С 23.12.20 - 14:11 | Возникло пару вопросов к уважаемому ALL по материалам ветки: Собираюсь писать ВК для 1С на C#
Почему то при обращении COM-объекта к DLL-библиотеке ANVIZ NET ожидает встретить 32 или 64-разрядную dll библиотеку tc-b_new_sdk.dll в папке рядом с моей компонентой AnvizCCH.dll. Иначе пишет, что попытка запустить плохой файл. Как сделать универсально, чтобы в зависимости от системы запускался тот или иной файл DLL. AnvizCCH.dll зарегистрировал через regasm и для 32 и для 64. В C# коде связывание tc-b_new_sdk.dll по имени tc-b_new_sdk Я пока вижу только переименовать в tc-b_new_sdk32 и tc-b_new_sdk64 и сделать два проекта для 32 и 64 разрядных ОС. Но это как-то криво. Можно проще как-то? P.s: и как убрать мигающую елку справа, закрывает окно написания поста? | ||
Serginio1 4 - 23.12.20 - 14:17 | Я тебе уже кучу раз ссылки давал на это | ||
Serginio1 5 - 23.12.20 - 14:18 | |||
Serginio1 6 - 23.12.20 - 14:19 | |||
Serginio1 7 - 23.12.20 - 14:21 | Но проще через SetDllDirectory Смотри как сделано в SDK | ||
Serginio1 8 - 23.12.20 - 14:22 | И про статические конструкторы вспомни тоже ссылки давал | ||
УдавВПопугаях 9 - 23.12.20 - 14:22 | нууу так не интересно, в век капитализма и рыночных отношений | ||
Гений 1С 10 - 23.12.20 - 14:27 | (5) ок, гляну. | ||
Garykom 11 - 23.12.20 - 14:43 | (0) 1. не тупи и делай разные версии 32 и 64 | ||
Garykom 12 - 23.12.20 - 14:43 | (11)+ потому что http://rsdn.org/forum/dotnet/1000458.all не освоишь
2. Елка убирается так же как и реклама | ||
Serginio1 13 - 23.12.20 - 14:45 | (11) Не надо. Просто 2 папки для 32 и 64 разрядных нативных библиотек. | ||
Serginio1 14 - 23.12.20 - 14:47 | Если одна библиотека то простоstatic class MyDll { static MyDll(){ var myPath = new Uri(typeof(MyDll).Assembly.CodeBase).LocalPath; var myFolder = Path.GetDirectoryName(myPath);
var is64 = IntPtr.Size == 8;
var subfolder = is64 ? "\\win64\\" : "\\win32\\";
LoadLibrary(myFolder + subfolder + "MyDll.dll");
}
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("MyDll.dll")] public static extern int MyFunction(int var1, int var2); } | ||
Serginio1 15 - 23.12.20 - 14:49 | Смотри статический конструктор, он выполняется раньше всех. В данном случае загружается нужная библиотека, а затем уже ищутся методы в загруженной библиотеке | ||
H A D G E H O G s 16 - 23.12.20 - 14:54 | Кхаб должен страдать. | ||
Гений 1С 17 - 23.12.20 - 17:00 | (14) спасибо, попробую. Отчитаюсь тут | ||
acht 18 - 23.12.20 - 17:14 | |||
Garykom 19 - 23.12.20 - 17:34 | (18) нет уж сразу на боевых серваках клиентов пусть пробует - во они обрадуются когда их сервера попадают | ||
Ненавижу 1С 20 - 23.12.20 - 18:02 | (19) в ларьках нет серверов | ||
Гений 1С 21 - 23.12.20 - 19:41 | |||
Йохохо 22 - 23.12.20 - 20:16 | |||
NorthWind 23 - 23.12.20 - 21:43 | Скайлинк? Это пров сотовой связи такой был лет 15 назад.
При чем он тут? | ||
TormozIT 24 - 23.12.20 - 22:35 | О, уже второй сезон сериала =) | ||
Serginio1 25 - 25.12.20 - 12:32 | (17)>> Отчитаюсь тут
Сергей как успехи? Как продвижение в изучении и реализации C#.
Есть вопросы? Волнуемся, переживаем! Чем помочь? | ||
Garykom 26 - 25.12.20 - 13:01 | (25) Можно ли управляемый код на C# вызывать из неуправляемого на C++ ? | ||
Garykom 27 - 25.12.20 - 13:02 | (26)+ без реализации COM сервера, обычная c-shared DLL | ||
Ненавижу 1С 28 - 25.12.20 - 13:11 | |||
Garykom 29 - 25.12.20 - 13:38 | (28) хмм получается ну да таким макаром можно на C# ваять Native API ВК для 1С
через прокладку на C++ вызывать сборки на C# | ||
Serginio1 30 - 25.12.20 - 13:43 | (26) Конечно! Ты забыл про Ъ
Кроссплатформенное использование классов .Net в 1С через Native ВК. Или замена COM на Linux
http://catalog.mista.ru/1c/articles/534901/ Правда я писал еще под под .Net Core 1 Сейчас для .Net Core >3 другой апи https://docs.microsoft.com/ru-ru/dotnet/core/tutorials/netcore-hosting Рекламное место пустует | ||
Serginio1 31 - 25.12.20 - 13:49 | Для некросплатформенного есть https://docs.microsoft.com/ru-ru/cpp/dotnet/mixed-native-and-managed-assemblies?view=msvc-160
Есть вариант взаимодействия через COM "CLR Hosting API" Использование .NET сборок в 1С 8.2, 8.3 без установки и без регистрации в реестре. http://catalog.mista.ru/public/300091/ | ||
Serginio1 32 - 25.12.20 - 13:58 | |||
Garykom 33 - 25.12.20 - 13:59 | (30) дык тоже dll прокладка, подразумевал что всего одна dll на C# которую можно вызывать из C++ unmanaged | ||
Serginio1 34 - 25.12.20 - 14:01 | (33) Смотри 32 | ||
Serginio1 35 - 25.12.20 - 14:08 | (33) Все в одном это С++ CLI. Вызов из нативного кода C# DLL это CLR Hosting API и nethost.h и hostfxr.h или CoreClrHost
Все они вызываются и нативного кода. Я просто сделал универсальную прокладку. Для отдельной ты сам можешь написать свою ВК без всяких Ъ | ||
Serginio1 36 - 30.12.20 - 11:22 | |||
qwerty 37 - 30.12.20 - 11:25 | (36) - он таки смог поставить Visual Studio | ||
Garykom 38 - 30.12.20 - 11:26 | (37) не ту поставил и не настроил sdk v120 | ||
qwerty 39 - 30.12.20 - 11:33 | (38) - ужос...
Ждем новый сезон "Гений проводит тонкую настройку Tomcat". Жанр: фильм - катастрофаТрейлер показывали в 2013м году: https://www.youtube.com/watch?v=E3418SeWZfQ | ||
Гений 1С 40 - 30.12.20 - 11:51 | (38) поставил последнюю, 2019-ю. | ||
Гений 1С 41 - 30.12.20 - 11:52 | (36) Спасибо. О достижениях рассказываю на Geni1s.ru. Как говорится, "вы еще не слышали о Гение 1С, но скоро вы о нем еще услышите"! | ||
H A D G E H O G s 42 - 30.12.20 - 12:52 | |||
Serginio1 43 - 30.12.20 - 14:14 | (42) Ну сам себя не похвалишь, никто не похвалит!
Другое дело, что здесь все Гении. И всех гениев и не только 1С с Новым Годом! И побольше Гениев не только 1С, но и в разных языках, от этого наша страна станет более гениальной. А можем жить согласно нашему гению! | ||
acht 44 - 30.12.20 - 14:22 | |||
Гений 1С 45 - 06.01.21 - 13:08 | Возник вопрос с VARIANT и COMSAFEARRAY до кучи (это ж тоже VARIANT)
В VB6 у меня были необязательные параметры методов, они были с типом Variant.
Как мне в C# преобразовать их в число или булево? Про массивы еще не дошел, но чую тоже понадобятся. Я передаю из 1С ComsafeArray в параметры методов. | ||
Ненавижу 1С 46 - 06.01.21 - 13:29 | (45) ну прочти хоть немного про c#. Хотя ты все еще думаешь, что это диалект Си | ||
Paint_NET 47 - 06.01.21 - 13:38 | (46) "А чо его изучать, это тот же Си" © фиксин :) | ||
H A D G E H O G s 48 - 06.01.21 - 13:39 | |||
H A D G E H O G s 49 - 06.01.21 - 13:43 | С++ и C# как бэ намекают Сергею, что он ниасилит
https://youtu.be/u0VT75jP-Yo?list=PL46NKry1dUo25uIdsdjl28YNQG0HNumhR&t=981 | ||
Serginio1 50 - 06.01.21 - 14:29 | (45) Еще раз советую посмотреть класс public class AutoWrap : IReflect
и главное метод public static object ОбернутьОбъект(object obj) и ПолучитьРеальныйОбъект(object obj) .Net сама преобразует для COM и из COM нужные типы https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/type-marshaling | ||
Serginio1 51 - 06.01.21 - 14:36 | |||
ДедМорроз 52 - 06.01.21 - 14:45 | Variant это структура,где хранятся простые типы и ссылки на сложные.
Соответственно,получаем или значение или ссылку на хранимое значение. Но,нужно не забывать,что для работы со значениями есть свои функции,так как значения требуют выделения и освобождения памяти. | ||
Гений 1С 53 - 06.01.21 - 15:11 | |||
Serginio1 54 - 06.01.21 - 17:07 | (53) Я зачем тебе ссылки даю? Автоматом преобразуются как в одну так и в другую сторону. А вот нетовские объекты и классы не помеченные как комовские нужно преобразовывать через IReflect | ||
Serginio1 55 - 06.01.21 - 17:12 | |||
Serginio1 56 - 06.01.21 - 17:14 | Можешь не спрашивать, а смотреть в отладчике, что получаешь | ||
Garykom 57 - 06.01.21 - 17:26 | интересно к концу 2021 осилит? | ||
Гений 1С 58 - 06.01.21 - 18:01 | (55) вот как мне на c# в COM-классе объявить что параметр метода - Variant или массив Variant?
public Test(Variant v) {
return (long)v + 1;
}
Так не работае, например. А если ты хочешь сказать, что он автоматом мне преобразует Variant в long, то что будет, если там будет не long, а string: public Test(long v) {//Как быть если v - string и мне нужно вернуть ее длину (тестово, допустим)? return v + 1;} | ||
Гений 1С 59 - 06.01.21 - 18:04 | (56) я вызываю класс из формы на c#, я там тип Variant не создам. А если из 1С вызывать, то можно трассирокой, в принципе (там отладчик не подхватит), но нужно понимать, какой в C# тип параметра объявлять. | ||
Serginio1 60 - 06.01.21 - 18:12 | Для начала объявиpublic void Test(object v) {
// return (long)v + 1;
и посмотри какой тип приходит
}
скорее всего будет public int Test(int v) { return v + 1;
}
Если из 1С нужно ссоздать объект А затем из студии оттладка- присоединиться к процессу. Ставь точки останова где тебе нужно и смотри Рекламное место пустует | ||
Serginio1 61 - 06.01.21 - 18:16 | |||
Гений 1С 62 - 06.01.21 - 21:35 | (60) а как тип посмотреть? object - это встроенный объект? и как задать не обязательный параметр
Test(object v = Null)? | ||
Гений 1С 63 - 06.01.21 - 21:38 | но даже если я увижу там int, как мне его получить? ведь там может быть и string?
(int)v (string)v в зависимости от типа v? | ||
Ненавижу 1С 64 - 06.01.21 - 21:56 | (62) ты же хвастался, что уже знаешь шарп, а про базовый object не в курсе? | ||
Serginio1 65 - 06.01.21 - 22:52 | (62) object это по сути variant любой тип можно привести к object
по типу можно преобразовать к нужному типу. Есть GetType(), is as и switchhttps://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching Про необязательные параметры и прочее. Прочитай https://metanit.com/sharp/tutorial/2.9.php Это снимет кучу вопросов. Test(object v = null) | ||
Serginio1 66 - 06.01.21 - 22:59 | Если ты знаешь какой тип передаешь то пиши метод с нужным типом
public int Test(int v) (62) В отладчике vj;yj nbg gjcvjnhtnm https://docs.microsoft.com/ru-ru/visualstudio/debugger/debugger-feature-tour?view=vs-2019 https://docs.microsoft.com/ru-ru/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2019 | ||
ДедМорроз 67 - 06.01.21 - 23:15 | Object это базовый тип,любой сложный тип(то есть объект)это потомок object.
Но,простые типы,типа int,на самом деле,не есть потомки object. Просто,для них создаётся дополнительный тип,который является объектом,но с одним значением простого типа. Variant же,это структура. Она в object напрямую не переносится. Кроме того,object живёт в пространстве виртуальной машины net,а variant живёт в пространстве процесса,вызывающего код net. Далее, есть специальный интерфейс IMarshal,который передает данные из пространства одного процесса в другой,и в его реализации можно спокойно сделать трансляцию одного в другое. Но,лучше не использовать массивы для передачи,так как трансляция массива не всегда очевидна. Кроме того,в variant могут быть переданы интерфейсы объектов,что для net подсистемы не совсем очевидно. | ||
Гений 1С 68 - 07.01.21 - 07:33 | |||
Serginio1 69 - 07.01.21 - 12:46 | (68) Говорят, что кур доят. Я тебе кучу ссылок давал. Все конвертируется автоматически.
Ты хоть попробовал? COMSAFEARRAY преобразуются к массивам нужного типа в зависимости от типа элемента int[], string[] итд | ||
Кирпич 70 - 07.01.21 - 13:00 | (69) "Ты хоть попробовал?"
Лучше пусть не пробует. А то гениальность так полыхнет, что таблетки придется пить. | ||
Serginio1 71 - 07.01.21 - 13:04 | Для проверки сделай 2 метода
public string[] TestGetArray()
{
return new string[]{первый, второй, третий}; } public void TestSetArray( object array) { var i=0;// cnfdm njxre jcnfyjdf} из 1С мас=Новый COMSafeArray("VT_I1",1); мас.SetValue(0,127); нетобъект.TestSetArray(мас); | ||
Serginio1 72 - 07.01.21 - 13:05 | ну скобки забыл поставить{"первый", "второй", "третий"}; И cnfdm njxre jcnfyjdf это ставь точку останова | ||
ДедМорроз 73 - 07.01.21 - 13:23 | Так 1с передает Array с типом vt_variant,так что там немного сложнее.
С другой стороны,array of object тоже вполне себе жилец. И я нигде не писал,что не конвертируется,я просто объяснял,что преобразования достаточно непрозрачные,так как адресные пространства разные. Ну и windows для типа variant точно также использует сериализации,только для этого есть специальный интерфейс,так как можно захотеть сериализовать свои интерфейсы. Но,1с умеет только IDispatch,так что лезть в дебри бессмысленно. | ||
Serginio1 74 - 07.01.21 - 13:35 | (73) Адресные пространства одинаковы. Среда .Net Jit ит все в нативный код.
Для ком создаются оболочки которые отвечают не только за конвертацию но и за подсчет ссылок https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/com-wrappers ну и таблица преобразования variant https://docs.microsoft.com/ru-ru/dotnet/standard/native-interop/customize-struct-marshaling#marshal-systemobject | ||
ДедМорроз 75 - 07.01.21 - 19:33 | У среды .Net свое адресное пространство.
То,что система делает преобразование - это понятно. Только преобразование - это потеря производительности. | ||
Serginio1 76 - 07.01.21 - 20:32 | (75) >> У среды .Net свое адресное пространство.
Можно ссылочку на такие заявления? Адресное пространство тоже. http://catalog.mista.ru/1c/articles/448668/ Вот здесь замер скорости, всего в 2.25 раза медленнее обычного 1С метода. Если бы был межпроцессный маршалинг, вызов бы был в сотни раз медленнее. Опять же при отладке подключаемся к процессу 1С, а не какому ни будь суррогату. | ||
Гений 1С 77 - 07.01.21 - 20:35 | (69) с массивом попробую. Но у меня есть и просто параметр (не массив) Variant, Который может быть int и boolean. Как тут быть? | ||
Serginio1 78 - 07.01.21 - 20:39 | 76+ Суть не в скорости, а в возможностях. ВК то нужны для расширения возможностей 1С Если нужна скорость можно заполнять объекты 1С из .Net | ||
Serginio1 79 - 07.01.21 - 20:45 | (77) Еще раз
public void TestVariant( object variant) { var i=0// ставь точку останова и смори какой тип} если передаешь любой тип то ссылку на преобразование типов я тебе уже давал https://docs.microsoft.com/ru-ru/dotnet/csharp/pattern-matching Кроме того, если бы наконец то соизволил посмотреть код ще раз советую посмотреть класс public class AutoWrap : IReflect и главное метод public static object ОбернутьОбъект(object obj) То там сравтение типов public static object ОбернутьОбъект(object obj) { if (obj != null)
{
Type Тип = obj.GetType();
if (Тип==typeof(System.IntPtr) || Тип==typeof(System.UIntPtr))
return new AutoWrap(obj);
if (Тип == typeof(System.Char))
return System.Convert.ToString(((char)obj));
if (ЭтоСемерка)
{
if (Тип == typeof(System.Decimal)) return ((Decimal)obj).ToString(CultureInfo.InvariantCulture);
if (Тип.IsPrimitive)
{
if ((Тип == typeof(System.Int64) || Тип == typeof(System.UInt32) || Тип == typeof(System.UInt64) || Тип == typeof(System.UInt16) || Тип == typeof(System.SByte)))
obj = Convert.ChangeType(obj, typeof(string), CultureInfo.InvariantCulture);
}
else if (!(Тип == typeof(System.DateTime)
|| Тип == typeof(System.String)
|| Тип == typeof(System.Decimal)
|| Тип.IsCOMObject)
)
obj = new AutoWrap(obj);
}
else
{ if (Тип.IsArray) { Type ТипМассива = Тип.GetElementType(); if (ТипМассива != null) Тип = ТипМассива; } if (!(Тип.IsPrimitive || Тип == typeof(System.Decimal) || Тип == typeof(System.DateTime) || Тип == typeof(System.String) || Тип.IsCOMObject) ) obj = new AutoWrap(obj); } } return obj;} | ||
Serginio1 80 - 07.01.21 - 20:46 | Я тебе ссылки не зря даю. Там все конкретно есть по твоим вопросам. Ты бы уже давно мог все проверить и написать кучу тестов | ||
Гений 1С 81 - 07.01.21 - 20:57 | (79) о, вот это то что нужно вроде. сегодня COM не ковырял, завтра буду, проверю на деле. Спасибо. ;-) | ||
Гений 1С 82 - 07.01.21 - 20:57 | (80) Завтра буду тестить. Спасибо. | ||
H A D G E H O G s 83 - 07.01.21 - 21:36 | Сергей вдупляет в ComSafeArray, внутри которого передаются из 1С в ВК параметры вызванного метода, я же правильно понимаю? | ||
Гений 1С 84 - 07.01.21 - 22:03 | (83) не уверен, что я правильно понимаю, о чем ты спрашиваешь. | ||
Serginio1 85 - 07.01.21 - 22:32 | (84) Наверное ты решил сделать всетаки ВК?
И использовать ILanguageExtender? ILanguageExtender { ...... void CallAsProc(int lMethodNum, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParams); void CallAsFunc(int lMethodNum, ref object pvarRetValue, [MarshalAs(UnmanagedType.SafeArray)] ref Array paParam); } Зачем тебе ВК непонятно. COM вполне достаточно Если хочешь получить параметры смотриhttps://docs.microsoft.com/ru-ru/dotnet/api/system.array?view=net-5.0 Опять же смотри NetObjetToIDispatch45 там есть класс ВК GlobalContext1C : IInitDone, ILanguageExtender | ||
H A D G E H O G s 86 - 07.01.21 - 22:33 | Вот так это делается у нас, в Дельфи function TBaseVKObject.GetParamAsInt64(lIndex: integer): int64; var varGet: OleVariant; begin SafeArrayGetElement(g_Params, lIndex, varGet); try result := varGet; except ErrorCode := -1 * (lIndex + 1); Raise Exception.Create('Параметр номер ' + inttostr(lIndex + 1) + ' не может быть преобразован в целое 8-ми байтовое беззнаковое.'); end; end; | ||
Serginio1 87 - 07.01.21 - 22:38 | (86) Эх я на Паскале Delphi лет 25 писал, но увы .Net больше возможностей.
Но ностальгирую (84) Еще посмотри http://rsdn.org/forum/dotnet/2213356.1 | ||
Serginio1 88 - 07.01.21 - 22:42 | Кстати про маршалинг массивовhttps://docs.microsoft.com/ru-ru/dotnet/framework/interop/default-marshaling-for-arrays (86) В .Net так public void CallAsFunc(int lMethodNum, ref object pvarRetValue, ref System.Array paParams) {  //Здесь внешняя компонента выполняет код функций. // switch(lMethodNum)//Порядковый номер метода { case (int)Methods.methShowErrorLog:  //Реализуем метод для показа сообщения об ошибке { string s1; s1 = (string)paParams.GetValue(0); | ||
Гений 1С 89 - 08.01.21 - 07:22 | (85) нет, я не буду делать ВК, я остаюсь с COM | ||
rphosts 90 - 08.01.21 - 07:28 | (89) старого пса нельзя научить новым фокусам | ||
Гений 1С 91 - 08.01.21 - 07:31 | (90) просьба не оффтопить в тематической ветке | ||
rphosts 92 - 08.01.21 - 08:12 | (91) ок, но и ты не оффтопь | ||
Гений 1С 93 - 08.01.21 - 08:24 | (92) в этой ветке я пишу сугубо про COM | ||
УдавВПопугаях 94 - 08.01.21 - 09:35 | так если просто ком, то зачем ленгвиджекстендер маршаллинг и остальное | ||
УдавВПопугаях 95 - 08.01.21 - 09:36 | для просто кома достаточно сделать саму длл комвидимой и интерфейс один/два/сколько надо, регать в реестре и использовать, больше ничего | ||
Гений 1С 96 - 08.01.21 - 11:50 | (94) потому что в параметры передается из 1С и в 1С ComSafeArray | ||
Гений 1С 97 - 08.01.21 - 11:50 | Робята, скажите, часто в функциях объявляю буфер:
IntPtr pBuff;
int len = 32000;
pBuff = Marshal.AllocHGlobal(len);
Могу я его вынести в функцию, чтобы он там выделялся, а удаляться будет при удалении переменной pBuff? | ||
jbond 98 - 08.01.21 - 12:18 | (97) зачем здесь делать рефакторинг единственого вызова?
Это какой язык? Если си или кресты - то можно попытаться сделать макро. Но опять же - зачем? | ||
Гений 1С 99 - 08.01.21 - 12:19 | Гм, вот счас мне надо в 1С вернуть массив строк, на Басик-зольдатен я просто возвращал массив, созданный DIM, и она маршаллировал в COMSAFEARRAY, посмотрим, что в Шарпе будет | ||
Гений 1С 100 - 08.01.21 - 12:20 | (98) есть десяток функций, каждая из них вызывает функцию обработки очереди сообщений, которая возвращает сообщение.
сообщение нужно разместить в неком буфере. я бы не против чтобы функция обработки очереди сообщений создавала этот буфер, но он не сотрется при выходе из функции? Надо попробовать, в принципе. |
1 2 3 ► |
Список тем форума
|