Однако я никогда не бываю полностью удовлетворен, когда что-то не полностью Для меня это имеет смысл, я изменил (а также обновил до 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
Код: Выделить всё
#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]