注册免费的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: enter image description here

我已指定 “目标框架” 在属性 - >应用 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> 
+0

谢谢,这两个方法的工作!但是现在我们是否只有在安装了.NET Framework v4.0.30319的情况下才限制dll的工作?是否有可能要求它使用任何可用的框架,可能就像提到'runtimeVersion =“*”' –

+0

'runtimeVersion =“v4.0.30319”'没有定义特定的构建,因为此版本号在所有.NET之间共享4.x运行时版本。因此,您将能够使用任何可用的.NET 4.x版本。 – Aurora