注册免费的COM DLL要求。NET框架3.5安装,虽然它工作正常时,注册
问题描述:
我有一个用C#写的COM DLL。我试图注册它,它工作正常。我试图免费使用它。注册免费的COM DLL要求。NET框架3.5安装,虽然它工作正常时,注册
我完全按照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>
应用程序清单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>
用法:
Method1是教程建议使用DLL的方式。我已经探索并提出了使用激活上下文的method2。
方法一:
/*
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;
}
问题:
当我尝试创建类的实例,这两种方法都失败,给出以下错误0x8 0131700(2148734720)(没有说明),然后我得到以下对话框提示安装的.NET Framework 3.5:
我已指定 “目标框架” 在属性 - >应用 SideBySide C#项目作为.NET框架4.5,并且它在注册com DLL的时候可以很好地工作。我不明白为什么它要求在没有注册的情况下使用旧版本。
我应该在清单文件中的任何位置指定.net框架版本吗? 可能是什么问题?任何帮助将不胜感激。
答
是的,你需要在使用.NET 4.0或更高版本时指定运行时版本。如果服务器清单中缺少此信息,则激活上下文将查找.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>
谢谢,这两个方法的工作!但是现在我们是否只有在安装了.NET Framework v4.0.30319的情况下才限制dll的工作?是否有可能要求它使用任何可用的框架,可能就像提到'runtimeVersion =“*”' –
'runtimeVersion =“v4.0.30319”'没有定义特定的构建,因为此版本号在所有.NET之间共享4.x运行时版本。因此,您将能够使用任何可用的.NET 4.x版本。 – Aurora