2017-07-31 96 views
2

我有一個用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框架版本嗎? 可能是什麼問題?任何幫助將不勝感激。

回答

2

是的,你需要在使用.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