Написание Proxy на C#

Автор Soultaker, 12.01.26, 13:12:00

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Soultaker

Здравствуйте. Кто-то пробовал писать Proxy на C#? Где искали информацию? В хелпе ничего нет, тупо описание методов. В примерах, один пример на паскале.
Как вести отладку?

Student2025

#1
Если изрекаться по вашей манере общения в прошлой моей теме - вы написали такую дичь.
В папке с примерами SDK все есть.

Soultaker

Цитата: Student2025 от 12.01.26, 13:50:36В папке с примерами SDK все есть.
Цитата: Student2025 от 12.01.26, 13:50:36вы написали такую дичь.
Как обычно, от этого пользователя, никакой полезной информации. Я думаю, Вы даже не видели папку с примерами.

Kolos

Цитата: Soultaker от 12.01.26, 13:12:00Здравствуйте. Кто-то пробовал писать Proxy на C#? Где искали информацию? В хелпе ничего нет, тупо описание методов. В примерах, один пример на паскале.
Как вести отладку?
На ...
изображение_2026-01-12_132006074.png

Soultaker

Цитата: Kolos от 12.01.26, 14:19:25На ...
изображение_2026-01-12_132006074.png
Из примеров я это понял. А я хочу на C# или C++.

Student2025

Цитата: Soultaker от 12.01.26, 14:03:58Как обычно, от этого пользователя, никакой полезной информации. Я думаю, Вы даже не видели папку с примерами.

Вы для начала грамотно вопрос поставьте, не надо глубоким кодингом без ТЗ заниматься!

Soultaker

Цитата: Student2025 от 12.01.26, 15:56:22Вы для начала грамотно вопрос поставьте, не надо глубоким кодингом без ТЗ заниматься!
Зачем мне советы ИИ?

Chipollino

Цитата: Soultaker от 12.01.26, 13:12:00Здравствуйте. Кто-то пробовал писать Proxy на C#? Где искали информацию? В хелпе ничего нет, тупо описание методов. В примерах, один пример на паскале.
Как вести отладку?
Прокси для Лоцмана - это библиотека экспортирующая определенный перечень функций с конкретными входными и выходными параметрами. Особенность написания прокси на C# - это не особенность Лоцман, а особенность написания динамических библиотек в C#.
По отладке: Хотите вести отладку - запускайте дебаг в среде разработки и отлаживайте. Аналогично как и с плагинами для Лоцмана.

Здесь вопрос скорее не к хэлпу лоцмана и примерам, а к знанию как писать dll на конкретном языке и отлаживать.

Student2025

Цитата: Soultaker от 13.01.26, 09:54:44Зачем мне советы ИИ?

А причем тут он? Насколько мне известно не один ИИ не знает ни Компас 3Д API, ни тем более Лоцман API.
Подобный вопрос годами ранее я уже задавал тут и на пару других форумах - ответы есть, но не про Вашу честь!

Я до сих пор отпечаток ботинка со своей спины с прошлой темы - не оттер.

Soultaker

Цитата: Chipollino от 13.01.26, 13:25:08По отладке: Хотите вести отладку - запускайте дебаг в среде разработки и отлаживайте
Хороший совет, я тоже люблю такие давать.

Цитата: Chipollino от 13.01.26, 13:25:08Аналогично как и с плагинами для Лоцмана.
Не аналогично. С плагинами ЛОЦМАН всё стандартно - взял dll от ЛОЦМАН, реализовал интерфейс плагина, подключил к ЛОЦМАН.
С прокси такое не прокатывает. Мало того, что я должен догадаться, что мне надо экспортировать функции, хотя C# из коробки это не поддерживает, так мне ещё надо переименовывать dll в lpl каждый раз как я поставил или убрал точку останова.

Цитата: Chipollino от 13.01.26, 13:25:08Здесь вопрос скорее не к хэлпу лоцмана и примерам
Приведите пожалуйста раздел где в хелпе написано о том как правильно настраивать окружение для написания прокси ЛОЦМАМ. А то видимо я тупой.

Soultaker

Цитата: Student2025 от 13.01.26, 13:28:46А причем тут он? Насколько мне известно не один ИИ не знает ни Компас 3Д API, ни тем более Лоцман API.
Подобный вопрос годами ранее я уже задавал тут и на пару других форумах - ответы есть, но не про Вашу честь!

Я до сих пор отпечаток ботинка со своей спины с прошлой темы - не оттер.

Чтобы писать такие посты как у вас не нужно знать API КОМПАС и, тем более, ЛОЦМАН. Вы хуже ТП АСКОН. Типичный ИИ слоп.

Student2025

#11
Цитата: Soultaker от 13.01.26, 15:29:43Чтобы писать такие посты как у вас не нужно знать API КОМПАС и, тем более, ЛОЦМАН. Вы хуже ТП АСКОН. Типичный ИИ слоп.

Поэтому, не надо вытирать ноги об форумчанах и особенно об Администратора - он вам этого не простит  :o:. А по теме уже все сказано как генерируются прокси классы. Можно поискать на форуме.

И если бы вы написали какое IDE используете (тк у всех разные механизмы) было бы проще. Например в VS указывается зависимости в свойствах проекта и он сам генерирует.

Однако рассматривал рефлексию и там тоже можно без генерации прокси классов так же как и в этом примере:
using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type comType = Type.GetTypeFromProgID("Kompas.Application.7");
        // Type comType = Type.GetTypeFromCLSID(new Guid("69AC2981-37C0-4379-84FD-5DD2F3C0A520"));

        dynamic comObject = Activator.CreateInstance(comType);

        comObject.Visible = true;
    }
}

Student2025

#12
Через рефлексию:

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        Type Kompas7Type = Type.GetTypeFromProgID("Kompas.Application.7");
        object Kompas7App = Activator.CreateInstance(Kompas7Type);

        // Установить Visible = true через рефлексию
        Kompas7Type.InvokeMember(
            "Visible",
            BindingFlags.SetProperty,
            null,
            Kompas7App,
            new object[] { true }
        );

        // Позже не забудьте выйти и освободить:
        // Kompas7App.InvokeMember("Quit", BindingFlags.InvokeMethod, null, Kompas7App, null);
    }
}

Опять же говоря только о VS - хорошо показывает и говорит о причинах ошибок что облегчает глубокий кодинг без ТЗ.

Я бы вам написал бы об удивительных инструментов инъекций и перехвата.. но здесь этого не любят..

Soultaker

Инструменты инъекций и перехвата  :-))) И прокси классы  :um:

Student2025

#14
Вам дебажить, не мне. Как говориться - каждому свое.
Приведите пример как извлечь параметры и их типы из неизвестной динамической функции API ?

Это при том что вам не поможет компонент для тотал командер который тут рассматривали, ни Dependency Walker, более чем уверен что не кто из того что вам предложит мало-мальски ИИ.

Soultaker

Цитата: Student2025 от 13.01.26, 21:37:16Вам дебажить, не мне. Как говориться - каждому свое.
Приведите пример как извлечь параметры и их типы из неизвестной динамической функции API ?

Это при том что вам не поможет компонент для тотал командер который тут рассматривали, ни Dependency Walker, более чем уверен что не кто из того что вам предложит мало-мальски ИИ.

Почему я вас считаю тупым ИИ.
1. Тема создана в разделе ЛОЦМАН и называется "Написание Proxy на C#".
2. В SDK лежит пример на делфи от 2006 года.
3. Kolos понял контекст моей темы.
4. Chipollino понял контекст моей темы, но намекнул, что я тупой и ни о чём, якобы не знаю C#.
5. А вы не поняли контекста и стали писать дичь. Как сейчас модно говорить ИИ слоп. Или по-русски говоря, словесный понос. Стали приплетать рефлексию, DI.

Soultaker

К сожалению по этой теме видно какой уровень разработчиков для продуктов АСКОН и это печально. Если кто-то столкнётся с такой же проблемой как и я, то вот решение.

1. Создаём Solution и проект
2. У solution и проекта выставляем целевую платформу х86.
3. Если у вас несколько проектов, то в главной dll нужно подписываться на эвент Assembly - AppDomain.AssemblyResolve; и грузить остальные dll.
4. В post event build главной сборки добавляем строку "echo F | xcopy "$(TargetDir)$(ProjectName)$(TargetExt)" "$(TargetDir)$(ProjectName).lpl" /f /y". Это делается для того, чтобы автоматически переименовывать dll в lpl. NET не поддерживает такой функционал, как например C++.

Дополнительно.
Кто вообще собирается разрабатывать на C# не забудьте найти инструменты для экспорта функций ([DllProxy]). Так как кто придумал архитектуру подключения Proxy был слишком умный, наверное как p3452.

Chipollino

Цитата: Soultaker от 13.01.26, 15:28:17Хороший совет, я тоже люблю такие давать.
Не аналогично. С плагинами ЛОЦМАН всё стандартно - взял dll от ЛОЦМАН, реализовал интерфейс плагина, подключил к ЛОЦМАН.
С прокси такое не прокатывает. Мало того, что я должен догадаться, что мне надо экспортировать функции, хотя C# из коробки это не поддерживает, так мне ещё надо переименовывать dll в lpl каждый раз как я поставил или убрал точку останова.
Приведите пожалуйста раздел где в хелпе написано о том как правильно настраивать окружение для написания прокси ЛОЦМАМ. А то видимо я тупой.

Справка для разработчика подразумевает, что её читает разработчик ПО с соответствующими знаниями.

Если хотите получить помощь - задавайте конкретные вопросы с примером вашего неудачного решения, которое более опытные коллеги попробуют исправить.
Хотите, чтобы Вас всему научили - обратитесь в учебное заведение. Я сейчас не шучу и не подкалываю - вполне серьезно.

Вы сами выбрали C# как инструмент для разработки библиотек зная, что он этого из коробки не делает и жалуетесь на проблемы? Рекомендации сменить язык или поучиться более глубоко желаемому языку не стоит при этом принимать в штыки.

Это примерно как токарь будет предъявлять конструктору, что в чертеже нет инструкции запуска и ремонта его станка на котором деталь делать будут ...


Если по существу настройки окружения, то библиотека (хоть плагин, хоть прокси) - это не самостоятельная программа, а дополнение к программе и при отладке надо запускать приложение, которое потом эту библиотеку вызовет.

Отладка в среде разработки настраивается в зависимости от среды разработки. Например для VS можно настроить проект для отладки библиотеки так - https://learn.microsoft.com/ru-ru/visualstudio/debugger/how-to-debug-from-a-dll-project?view=visualstudio



P.S.
Я изначально не считаю собеседников тупыми если они не докажут обратное, но вижу, что базовых знаний в программировании и работе со средой разработки явно не хватает. При этом вопросы тянут на мини курс, который должны завсегдатаи форума выдать в одном посте...

Хотите, чтобы за Вас сделали прокси - опишите решаемую задачу и озвучьте бюджет. Хотите, чтобы научили это делать - боюсь темы на форуме не хватит.


P.P.S.
Цитата: Soultaker от 14.01.26, 09:08:094. В post event build главной сборки добавляем строку "echo F | xcopy "$(TargetDir)$(ProjectName)$(TargetExt)" "$(TargetDir)$(ProjectName).lpl" /f /y". Это делается для того, чтобы автоматически переименовывать dll в lpl. NET не поддерживает такой функционал, как например C++.
В файл Вашего проекта *.csproj нужно добавить параметр <TargetExt>.lpl</TargetExt> и будет всё хорошо без переименования сторонними средствами.

Но с чего это стало проблемой разработчиков Аскон?

Soultaker

Цитата: Chipollino от 14.01.26, 12:57:58В файл Вашего проекта *.csproj нужно добавить параметр <TargetExt>.lpl</TargetExt> и будет всё хорошо без переименования сторонними средствами.
Я же говорю, Вы меня посчитали за тупого. Вы сами то добавляли этот тэг?

Error : Invalid Option: /LPL
sbStdout


Usage: ilasm [Options] <sourcefile> [Options]

Options:
/NOLOGO         Don't type the logo
/QUIET          Don't report assembly progress
/NOAUTOINHERIT  Disable inheriting from System.Object by default
/DLL            Compile to .dll
/EXE            Compile to .exe (default)
/PDB            Create the PDB file without enabling debug info tracking
/APPCONTAINER   Create an AppContainer exe or dll
/DEBUG          Disable JIT optimization, create PDB file, use sequence points from PDB
/DEBUG=IMPL     Disable JIT optimization, create PDB file, use implicit sequence points
/DEBUG=OPT      Enable JIT optimization, create PDB file, use implicit sequence points
/OPTIMIZE       Optimize long instructions to short
/FOLD           Fold the identical method bodies into one
/CLOCK          Measure and report compilation times
/RESOURCE=<res_file>    Link the specified resource file (*.res)
            into resulting .exe or .dll
/OUTPUT=<targetfile>    Compile to file with specified name
            (user must provide extension, if any)
/KEY=<keyfile>      Compile with strong signature
            (<keyfile> contains private key)
/KEY=@<keysource>   Compile with strong signature
            (<keysource> is the private key source name)
/INCLUDE=<path>     Set path to search for #include'd files
/SUBSYSTEM=<int>    Set Subsystem value in the NT Optional header
/SSVER=<int>.<int>  Set Subsystem version number in the NT Optional header
/FLAGS=<int>        Set CLR ImageFlags value in the CLR header
/ALIGNMENT=<int>    Set FileAlignment value in the NT Optional header
/BASE=<int>     Set ImageBase value in the NT Optional header (max 2GB for 32-bit images)
/STACK=<int>    Set SizeOfStackReserve value in the NT Optional header
/MDV=<version_string>   Set Metadata version string
/MSV=<int>.<int>   Set Metadata stream version (<major>.<minor>)
/PE64           Create a 64bit image (PE32+)
/HIGHENTROPYVA  Set High Entropy Virtual Address capable PE32+ images (default for /APPCONTAINER)
/NOCORSTUB      Suppress generation of CORExeMain stub
/STRIPRELOC     Indicate that no base relocations are needed
/ITANIUM        Target processor: Intel Itanium
/X64            Target processor: 64bit AMD processor
/ARM            Target processor: ARM (AArch32) processor
/ARM64          Target processor: ARM64 (AArch64) processor
/32BITPREFERRED Create a 32BitPreferred image (PE32)
/ENC=<file>     Create Edit-and-Continue deltas from specified source file

Key may be '-' or '/'
Options are recognized by first 3 characters (except ARM/ARM64)
Default source file extension is .il

Target defaults:
/PE64      => /PE64 /ITANIUM
/ITANIUM   => /PE64 /ITANIUM
/X64       => /PE64 /X64
/ARM64     => /PE64 /ARM64

Soultaker

Цитата: Chipollino от 14.01.26, 12:57:58Справка для разработчика подразумевает, что её читает разработчик ПО с соответствующими знаниями.
Милок, где в справке написано, что на C# мне надо экспортировать функции? Вы хоть знаете для чего в компилируемых языках придумали механизм экспортирования функций? Вы хоть знаете почему до сих пор на NET платформе из коробки идёт только импорт функций?

Цитата: Chipollino от 14.01.26, 12:57:58Я изначально не считаю собеседников тупыми если они не докажут обратное, но вижу, что базовых знаний в программировании и работе со средой разработки явно не хватает. При этом вопросы тянут на мини курс, который должны завсегдатаи форума выдать в одном посте...
Базовые знания  :-)))
Странно получается. Чтобы писать под AutoCAD мне не надо было лезть ILAsm. Чтобы писать под Solidworks мне не надо было лезть ILAsm. И чтобы писать по Inventor мне не надо было лезть в ILAsm. А вот чтобы написать прокси под ЛОЦМАН мне чудесным образом надо понять, что надо экспортировать функции. Хорошо, что люди уже сталкивались с такими проблемами.
Если разработчики ЛОЦМАН придумали кривую архитектуру реализации прокси, то это не проблемы пользователей. Скорей всего там какой-нибудь умач не придумал ничего лучше как загружать любую dll(lpl), читать таблицу символов и искать нужные экспортные функции. Но при этом ни где этой информации нет.
Милок, ты хоть знаешь как толковые разработчики, в том же Autodesk писали обёртки для C++ кода для NET API. Они поступили по человечески, разделили зоны ответственности.
Что интересно, если писать плагин для ЛОЦМАН, то там не надо экспортировать функции. Видимо плагины для ЛОЦМАН могут писать низкоквалифицированные специалисты.