Как из Win32 приложений вызывать библиотеки .NET

pmgns
Дата: 29.12.2009 10:47:22
Вызов .NET библиотеки из кода из Директума
CallProcedure('DirRepKol.dll';'open';'ED';'frfr')
такой вызов не дотнетной библиотеки заканчивается благополучно....
функцию пытался и с пространством имен и с именем класса указывать...
пишет все равно - "Не найдена функция "open"."
Кто нибудь сталкивался?
dvim
Дата: 29.12.2009 10:58:53
pmgns,
Ключевые слова "COm interop property" При его установке компилится dll видимая в win32

http://bytes.com/topic/c-sharp/answers/227106-using-c-dll-vb6
Делали, решение вполне работоспособно.
pmgns
Дата: 29.12.2009 11:25:30
Поставил в свойствах проекта галочку. Сделать сборку видимой для COM. Не помогает((
gds
Дата: 29.12.2009 11:38:31
pmgns,

например вот так для vc++
using System;

namespace gds.Common {
	public sealed class NMewTestClass {
		public static int NewTestMethod(String s) {
			Console.WriteLine("Managed assembly: {0}", s);
			return s.Length;
		}
	}
}

[SRC c#]
using System;

namespace gds.Common {
public sealed class NMewTestClass {
public static int NewTestMethod(String s) {
Console.WriteLine("Managed assembly: {0}", s);
return s.Length;
}
}
}
[/SRC]
gds
Дата: 29.12.2009 11:39:19
pmgns,

например вот так для vc++
using System;

namespace gds.Common {
	public sealed class NMewTestClass {
		public static int NewTestMethod(String s) {
			Console.WriteLine("Managed assembly: {0}", s);
			return s.Length;
		}
	}
}

[SRC c#]
using System;

namespace gds.Common {
public sealed class NMewTestClass {
public static int NewTestMethod(String s) {
Console.WriteLine("Managed assembly: {0}", s);
return s.Length;
}
}
}
[/SRC]
gds
Дата: 29.12.2009 11:43:04

#include <Windows.h>
#include <MSCorEE.h>
#include <stdio.h>

void main(int argc, WCHAR **argv) {
ICLRRuntimeHost *pClrHost;
HRESULT hr = CorBindToRuntimeEx(
NULL, // desired CLR version (NULL=latest)
NULL, // desired GC flavor (NULL=workstation)
0, // desired startup flags
CLSID_CLRRuntimeHost, // CLSID of CLR
IID_ICLRRuntimeHost, // IID of ICLRRuntimeHost
(PVOID*) &pClrHost); // returned COM interface

pClrHost->Start();
DWORD retVal;
hr = pClrHost->ExecuteInDefaultAppDomain(
L"d:\NETASM\\gds.Common.dll",
L"gds.Common.NewTestClass", L"NewTestMethod", L"Load assembly complite", &retVal);

wprintf(L"Managed code returned %d", retVal);

}

using System;

namespace gds.Common {
public sealed class NewTestClass {
public static int NewTestMethod(String s) {
Console.WriteLine("Managed assembly: {0}", s);
return s.Length;
}
}
}

p/s/ почему то не работает дискриптор "src c"
Одна из основных проблем человека - проблема выбора.
dvim
Дата: 29.12.2009 12:36:58
gds,
Поставил в свойствах проекта галочку. Сделать сборку видимой для COM. Не помогает((


[ComVisible(true)] ставили ?
поищите пример исъодного кода , по COM Interop его полно
gds
Дата: 29.12.2009 13:12:07
dvim
[ComVisible(true)] ставили ?

Нет. Зачем? вы же через интерфейс ICLRRuntimeHost инициируете оболочку (домен) FW. И затем в ней после запускаете свое приложение.
По сути COM Interop делает тоже самое только иначе, подход чуть другой.

Для запуска Managment Code вам полубому нужен FW и домен в котором от будет отрабатывать. А точнее библиотека MsCorrEE.dll соответствующей версии.
пример был на чистом Си. Для удобства можно использовать VC/CLR (in param Managment Code, out param UnManagment Code). Там чуть проще управлять Managment Code. Но в итоге тоже самое получается. Только что ресурсов требует больше.