gpt4 book ai didi

c# - 注册免费 com dll 要求安装 .net framework 3.5,注册时运行正常

转载 作者:可可西里 更新时间:2023-11-01 10:14:31 26 4
gpt4 key购买 nike

我有一个用 C# 编写的 COM DLL。我已经尝试注册它并且它工作正常。我正在尝试免费注册使用它。

我完全遵循了 this MSDN 教程。

SideBySide DLL 源:

using System;
using System.Reflection;
using System.Runtime.InteropServices;
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: Guid("C49B4D72-DEB3-41F3-87DE-9AA0E0E99809")] //LIBID_SideBySide

namespace SideBySide
{
[Guid("1289C276-6CF8-456F-9CD3-14363BA5BEB5")] //IID_ISideBySideClass
public interface ISideBySideClass
{
string Version();
}

[Guid("16AD5303-E154-44B4-A72B-C129859714AD")] //CLSID_SideBySideClass
public class SideBySideClass : ISideBySideClass
{
public string Version()
{
return "1.0.0-C#";
}
}
}

SideBySide.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="SideBySide"
version="1.0.0.0" />
<clrClass
clsid="{16AD5303-E154-44B4-A72B-C129859714AD}"
progid="SideBySide.SideBySide"
threadingModel="Both"
name="SideBySide.SideBySideClass" >
</clrClass>
</assembly>

应用程序 list Client.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type = "win32"
name = "client"
version = "1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="SideBySide"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>

用法:

方法 1 是教程建议的使用 DLL 的方式。我已经探索并提出了使用激活上下文的方法 2。

方法一:

/*
Using CreateInstance
*/
int method1()
{
CoInitializeEx(0, COINIT_MULTITHREADED);
ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));
if (SUCCEEDED(hr))
{
cout << ptr->Version() << endl;
}
else
{
//The dialog box asking for .net framework 3.5 installation comes up here
}
CoUninitialize();
return 1;
}

方法2:

/*
Using Activation context
*/
int method2()
{
HRESULT _hr = CoInitializeEx(0, COINIT_MULTITHREADED);
if( _hr != S_OK)
{
return FALSE;
}

DWORD cookie = 0;

ACTCTX actctx;
actctx.cbSize = sizeof(ACTCTX) ;
actctx.lpSource = L"SideBySide.dll";
actctx.lpResourceName = //_T("SideBySide"); //error
MAKEINTRESOURCE(1); //This alone worked for CreateActCtx
//MAKEINTRESOURCE(2); //error
actctx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID ;

HANDLE hActCtx = CreateActCtx(&actctx);
if( hActCtx == INVALID_HANDLE_VALUE)
{
//This usually fails here.
//But with the above mentioned values this succeeds
return E_FAIL;
}

BOOL fOK = ActivateActCtx(hActCtx, &cookie);
if (!fOK)
{
return E_FAIL;
}

CComPtr<ISideBySideClass> spCSharpTest;
HRESULT hr = spCSharpTest.CoCreateInstance(__uuidof(SideBySideClass));

if (hr != S_OK)
{
//The dialog box asking for .net framework 3.5 installation comes up here
}
else
{
cout << "Load Successfully : SideBySideClass" << endl;
spCSharpTest->Version();
//Need not release. CComPtr will take care of it
}

DeactivateActCtx(0, cookie);
ReleaseActCtx(hActCtx);
CoUninitialize();
return 0;
}

问题:

当我尝试创建该类的实例并给出以下错误 0x80131700 (2148734720)(没有描述)时,这两种方法都失败了,然后我得到以下对话框提示安装 .net framework 3.5 : enter image description here

我在 SideBySide C# 项目的 Properties->Application 中将“Target framework”指定为 .NET framework 4.5,并且在注册 com dll 时它可以完美运行。我不明白为什么在不注册的情况下尝试使用时会要求提供旧版本。

我应该在 list 文件中的任何位置指定 .net Framework 版本吗?可能是什么问题呢?任何帮助将不胜感激。

最佳答案

是的,您需要在使用 .NET 4.0 或更高版本时指定运行时版本。如果服务器 list 中缺少此信息,激活上下文将查找 .NET 4.0 之前可用的最高运行时版本,即 3.5 版。

只需按如下方式添加所需的 .NET 运行时版本(注意 runtimeVersion 属性):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1"
manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="SideBySide"
version="1.0.0.0" />
<clrClass
clsid="{16AD5303-E154-44B4-A72B-C129859714AD}"
progid="SideBySide.SideBySide"
threadingModel="Both"
name="SideBySide.SideBySideClass"
runtimeVersion="v4.0.30319" >
</clrClass>
</assembly>

关于c# - 注册免费 com dll 要求安装 .net framework 3.5,注册时运行正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45418868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com