Создан COM-объект с помощью .Net 8. Он просто работает (TM), но я борюсь с deps.json и использую собственный код.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Создан COM-объект с помощью .Net 8. Он просто работает (TM), но я борюсь с deps.json и использую собственный код.

Сообщение Anonymous »

У меня есть DLL .Net 4.72, доступная для COM с помощью ComVisible(true) и остальных. Я приведу пример через секунду. Я модернизировал эту DLL до .Net 8. Эта DLL использует некоторые зарегистрированные 32-разрядные файлы ocx через Interops, поэтому я всегда создаю DLL как x86. В .Net 4.72 для этого можно использовать «Любой процессор». В .Net Core+ вам необходимо явно указать x86, что, я думаю, связано с созданной сейчас comhost.dll. Эта DLL является чем-то вроде мерзости, потребляемой полностью однопоточным приложением (PowerBuilder), поэтому на самом деле она написана как net8.0-windows с UseWindowsForms, установленным в true, чтобы разрешить перекачку сообщений, поэтому пользовательский интерфейс не заморозить целиком. Действительно старомодное приложение только для Windows. И это работает. Приложение PowerBuilder может прекрасно загружать DLL, поскольку я сохранил нетронутым GUID, а также ProgId.
Однако я никогда не бываю полностью удовлетворен, когда что-то не полностью Для меня это имеет смысл, я изменил (а также обновил до net8.0-windows, потому что это приложение Winforms) тестовое приложение C #, которое мы устанавливаем вместе с DLL, чтобы позволить пользователю загружать DLL в качестве ссылки на проект или как COM. объект. Это быстрый способ проверить что-то на клиенте, где установлен этот пакет. Здесь я решаю проблемы двумя разными способами.
Я обнаружил, что если я удалю файл deps.json из DLL, я смогу загрузить его через ProgId, выполнив следующее:

Код: Выделить всё

    var dynamic? _myDll = null;
var readerType = Type.GetTypeFromProgID("MyProgId");
_myDll = Activator.CreateInstance(readerType);
В отладчике это работает всегда. При установке возникает исключение:
80040111 ClassFactory не может предоставить запрошенный класс (Исключение из HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE))
Однако, если я удалю сгенерированный файл deps.json, он отлично работает через COM из мое приложение на C#. Я тщательно просмотрел сгенерированный файл и проверил, что все зависимости установлены вместе с DLL, включая зависимости зависимостей. Я проверил регистрацию COM (хотя на самом деле это очевидно, поскольку она работает).
В отчаянии я решил пойти еще дальше и написать крошечное консольное приложение на C++/Win32 для загрузки. DLL через COM, CoInit объекта, получение открытого интерфейса и вызов одного метода. Я тоже не могу заставить это работать. Я могу загрузить COM-объект и создать его экземпляр, но не могу заставить интерфейс загружаться должным образом. Прошло много времени с тех пор, как я занимался C/C++, и еще больше с тех пор, как я имел дело с COM.
Вот суть того, что у меня есть:
C#

Код: Выделить всё

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ProgId("MyProgId")]
[Guid("NewGuidAfterUpgrade")]
public class MyDll : IMyDll
{
//example
public int Connect()
{
//do stuff
return 0;
}
}

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("OldGuidBeforeUpgrade")]
public interface IMyDll
{
int Connect();
}

project file attributes:

net8.0-windows
x86
x86
win-x86
true
true
MyDll.snk
true
true


Вот одна из итераций, которые я пытаюсь использовать в C++:

Код: Выделить всё

#include 
#include 
#include 
#include 

#pragma comment(lib, "comsuppw.lib")

static const GUID IID_IMyDll =
{ broken out guid };

interface IMyDll : public IDispatch
{
virtual HRESULT STDMETHODCALLTYPE Connect(int* result) = 0;
};

int main()
{
// Initialize COM
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)) {
std::cerr 

Подробнее здесь: [url]https://stackoverflow.com/questions/78687046/created-com-object-with-net-8-it-just-works-tm-but-i-am-struggling-with-deps[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Создан COM-объект с помощью .Net 8. Он просто работает (TM), но я борюсь с deps.json и использую собственный код.
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как я могу встроить runtimeconfig.json и deps.json в .NET 9?
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как я могу встроить runtimeconfig.json и deps.json в .NET 9?
    Anonymous » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Борюсь с этой ошибкой при попытке запустить этот тип в веб-конфигурации с помощью ASP.Framework.
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Немного борюсь с C++ (без опыта программирования) [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»