Может ли нативное приложение использовать COM без регистрации для использования компонента .NET COM?

В: Могу ли я создать собственный клиент, который использует COM-компонент .NET, используя рег-свободный COM?

То есть Могу ли я создать приложение C ++ с информацией COM в своем манифесте вместо регистрации компонента (COM ‘stuff’) в реестре?


Примечание: я начал смотреть на reg free COM, имея в виду этот вопрос, и не нашел быстрого ответа с помощью веб-поиска. Когда я нашел ответ, подумал, что я буду публиковать на SO в случае, если кто-то еще ищет …

1

Решение

Да.

А вот в MSDN есть статья (с 2005 года), в которой рассматривается рабочий пример:

…активация .NET Framework компонента без регистрации нативными клиентами через COM-взаимодействие. (11 печатных страниц)
https://msdn.microsoft.com/en-us/library/ms973915.aspx (по состоянию на январь 2015 г.)

2

Другие решения

Дарын,

Эта запись блога объяснит вам, как это сделать:
http://blogs.msdn.com/b/rodneyviana/archive/2015/08/24/pure-native-c-consuming-net-classes-without-com-registration.aspx

В основном вы используете точку входа для возврата указателя на интерфейс (используя DllExport Nuget для «экспорта»):

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using RGiesecke.DllExport;

namespace ContosoCom
{

public static class Exports
{
[DllExport(CallingConvention = CallingConvention.Cdecl)]
public static void GetClass([Out] [MarshalAs((UnmanagedType.Interface))] out IMyClass pInterface)
{
pInterface = new MyClass();
}
}[ComVisible(true)]
[System.Runtime.InteropServices.InterfaceTypeAttribute(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyClass
{
void DisplayMessageBox([MarshalAs(UnmanagedType.BStr)] string Text);
void GetTicksAndDate([Out] out MyStruct Structure);
}

[ComVisible(true)]
[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct MyStruct
{
public long TicksOfNow;
public int Day;
public int Month;
public int Year;
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IMyClass))]
public class MyClass : IMyClass
{

public void DisplayMessageBox(string Text)
{
MessageBox.Show(Text);
}

public void GetTicksAndDate(out MyStruct Structure)
{
Structure.TicksOfNow = DateTime.Now.Ticks;
Structure.Day = DateTime.Now.Day;
Structure.Month = DateTime.Now.Month;
Structure.Year = DateTime.Now.Year;
}
}

}

И вот как выглядит код C ++:

#include "stdafx.h"#import "..\..\bin\Debug\ContosoCom.tlb" auto_renameusing namespace ContosoCom;
typedef void(*pGetClass)(IMyClass **iMyClass);int _tmain(int argc, _TCHAR* argv[])
{
pGetClass getClass = NULL;
IMyClass *mc = NULL;

HINSTANCE hDLL = 0;
// load the DLL

hDLL = ::LoadLibrary(L"ContosoCom.dll");

::CoInitialize(NULL);

if(!hDLL)
{
printf("ERROR: Unable to load library ContosoCom.dll\n");
return -1;
}//
// TO DO: Add code here to get an instance of MyClass
//
getClass = (pGetClass)GetProcAddress(hDLL, "GetClass");

if(!getClass)
{
printf("ERROR: Unable to find entry for GetClass()\n");
return -1;

}

getClass(&mc);

// At this point we do not have how to get a pointer even with the libray loaded

// End of TO DO

if(!mc)
{
printf("ERROR: Unable to get a pointer for MyClass\n");
return -1;
}

mc->DisplayMessageBox("Hello World from native to .NET without registration");
MyStruct st;
ZeroMemory(&st, sizeof(MyStruct));
mc->GetTicksAndDate(&st);
printf("Ticks %I64i\n",st.TicksOfNow);
printf("Today is %i/%i/%i\n",st.Month,st.Day,st.Year);printf("SUCCESS: Leaving gracefully\n");
return 0;
}
2

По вопросам рекламы [email protected]