powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов методов из DLL С# в длл на С
7 сообщений из 7, страница 1 из 1
Вызов методов из DLL С# в длл на С
    #39341410
Фотография pf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем. Есть интересная задача:

1. Есть DLL на С , в ней метод, в котором :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
HMODULE HXlsDll = LoadLibrary(_J("TestLibrary.dll"));
if (HXlsDll)
{
  f_NetUse_TEST = (f_NetUseFUNC) GetProcAddress(HXlsDll, _J("f_TESTFUNCTION"));
}
if( f_NetUse_TEST )
{
  f_NetUse_TEST(&dsNetUse);
}



В Н-файле обьявлено:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
typedef struct tagDSNETUSE
{
  long	            nParam1;  
} DSNETUSE, *lpdsNetUse;

typedef LRESULT (*f_NetUseFUNC)(lpdsNetUse);
f_NetUseFUNC  f_NetUse_TEST;



TestLibrary - DLL C#, f_TESTFUNCTION - метод в этой DLL . При выполнении кода С - DLL загружается, но метод не находит. Как правильно вызвать метод DLL C# из кода на С/С++?
...
Рейтинг: 0 / 0
Вызов методов из DLL С# в длл на С
    #39341438
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гугл почитай .

DLL на C# это не классическая DLL, а сборка .NET. Это промежуточный IL-код (ассемблер .NET), который должен быть сначала откомпилирован, затем выполнится. Вобщем сначала надо CLR (ядро .NET) запустить, затем через него код из DLL. Я не пробовал так делать.
...
Рейтинг: 0 / 0
Вызов методов из DLL С# в длл на С
    #39341448
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Гугл почитай .

DLL на C# это не классическая DLL, а сборка .NET. Это промежуточный IL-код (ассемблер .NET), который должен быть сначала откомпилирован, затем выполнится. Вобщем сначала надо CLR (ядро .NET) запустить, затем через него код из DLL. Я не пробовал так делать.
зачем всё это писать?

pf,

решение имеется, хоть и не особо изящное: http://www.codeproject.com/Articles/16310/How-to-Automate-Exporting-NET-Function-to-Unmanage
пример использования http://www.codeproject.com/Articles/16374/How-to-Write-a-Terminal-Services-Add-in-in-Pure-C

(дизассемблировать сборку, добавить инструкцию, описывающую нативную точку входа, собрать заново)
...
Рейтинг: 0 / 0
Вызов методов из DLL С# в длл на С
    #39342077
Артем_84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот ЭТО юзал, делает то же , но автоматически.

ЗЫ работало только с EN системой, с RU - глючило
...
Рейтинг: 0 / 0
Вызов методов из DLL С# в длл на С
    #39342230
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pfКак правильно вызвать метод DLL C# из кода на С/С++?

В C# экспортировать интерфейс и реализацию через COM.

В Си импортировать COM-интерфейс и вызвать нужный метод интерфейса.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Вызов методов из DLL С# в длл на С
    #39658202
Фотография pf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

Опять вернулся после долгого перерыыва к этому вопросу.
С# код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace TestC
{
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface ITestInterface
    {
        void f_Message(string strMessage);
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    public class TestC: ITestInterface
    {                
        [ComVisible(true)]
        public void f_Message(string strMessage)
        {
            strMessage = "Welcome to C#";
            MessageBox.Show(strMessage, "УРА-УРА");
        }
    }
}



В настройках проекта стоит галка : Register for COM interop

В assemly.cs выставлен [assembly: ComVisible(true)]

При сборке создается dll, pdb и tlb.

Попытка вызвать это чудо из С:
Код: plaintext
1.
2.
3.
4.
5.
6.
#define DLLImport extern "C" __declspec(dllimport) 

DLLImport void f_Message(wchar_t strMessage);


f_Message(L'wdwd');



При сборке вылетает ошибка :

unresolved external symbol __imp__f_Message referenced in function "int __cdecl InitInstance(struct HINSTANCE__ *,int)" (?InitInstance@@YAHPAUHINSTANCE__@@H@Z)

где функция InitInstance - функция, из которой вызываю метод f_Message из DLL C# ...

При попытке просмотреть свою DLL C# с помощью depends - вижу, что не обнаруживает метод, который экспортируется

P.S. Попытка использования методики, которая описана здесь :
https://www.codeproject.com/Articles/612604/Best-Practice-in-Writing-a-COM-Visible-Assembly-Cs
...
Рейтинг: 0 / 0
Вызов методов из DLL С# в длл на С
    #39658273
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pf,

Я попробую смонстрячить вам пример, как освобожусь.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вызов методов из DLL С# в длл на С
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]