2016-05-09 118 views
3
  • 創建一個新的Class Library (Package)項目
  • 改變了project.json看起來像這樣(添加項目依賴):

project.json類型'DateTime'是在未引用的程序集中定義的?

{ 
     "version": "1.0.0-*", 
     "description": "WMI.ECM.PCMS.Services.Acomba Class Library", 
     "authors": [ "WILL" ], 
     "tags": [ "" ], 
     "projectUrl": "", 
     "licenseUrl": "", 

     "dependencies": { 
      "Acomba.SDK": "2.0.0", 
      "WMI.ECM.Inventory.Models": "", 
      "WMI.ECM.Inventory.Services": "", 
      "WMI.ECM.Inventory.Services.Contracts": "" 
     }, 

     "frameworks": { 
      "dnx451": { }, 
      "dnxcore50": { 
       "dependencies": { 
        "Microsoft.CSharp": "4.0.1-beta-23516", 
        "System.Collections": "4.0.11-beta-23516", 
        "System.Linq": "4.0.1-beta-23516", 
        "System.Runtime": "4.0.21-beta-23516", 
        "System.Threading": "4.0.11-beta-23516" 
       } 
      } 
     } 
    } 
  • 編譯解決方案,並我得到這個錯誤:

The type 'DateTime' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PunlicKeyToken=b77a5c561934e089'.

  • 然而,我沒有與我的其他項目,這個問題也針對DNX451和DNXCORE50。我還應該提及,mscorlib.dll實際上是通過此屏幕截圖在相關項目中引用的:Referenced assemblies

因此,我做了一些最終無能爲力的搜索。

我試圖依賴於我的project.json添加到dnx451 {}像這樣:

"dnx451": { 
    "dependencies": { 
    "Microsoft.CSharp": "", 
    "System.Runtime": "" 
    ... 
    } 
} 

因爲我記得讀過這樣的解決方案的地方,並沒有奏效。

它看起來像一個共同的問題,雖然我無法找到任何有用的解決實際問題。

目前使用

  • 的Visual Studio 2015年社區 - 版本14.0.25123.00更新2
  • 的.NET Framework 4.6。01055
  • ASP.NET MVC 6只裝
  • SideWaffle的xUnit的DNX單元測試項目模板
  • 的Visual C#2015

UPDATE

它似乎是由COM庫而導致其我使用VS CMD行的這個工具導入:Tlbimp.exe (Type Library Importer)

簡而言之,AcoSDK.dll是一個COM庫,我使用上述工具導入,創建一個.NET程序集,並將所有COM類型解析爲.NET類型。

然後,我用NuGet.exe創建了一個我發佈在我的私人提要上的包。

然後,我在我的項目中引用了我的project.json中的"Acomba.SDK": "2.0.0"包。

每當我使用此包中的DateTime屬性時,都會發生構建錯誤。例如,這將導致發生錯誤:

public DateTime CreatedAt { get { return p.PrTimeModified; } } 

這並不:

public DateTime CreatedAt { get { return new DateTime(); } } 

的.NET日期時間的COM類型是日期。但是,應按照tlbimp.exe命令行上提供的示例中的步驟將它視爲DateTime。

只有當我給該屬性添加一個點時,我發現DNXCORE50中不支持DateTime。除了它是用於本地DateTime,例如'new DateTime()'(see screenshot here)。

任何線索如何解決這個問題?

+0

爲什麼在地球上你這樣做?定位CoreCLR/CoreFx有助於您的代碼在某天在Linux或OSX上運行。該COM組件永遠不會。 –

+0

@HansPassant:爲什麼不呢?我的意思是,一旦包裝在.NET導入類型程序集中,作爲NuGet程序包發佈,然後使用適當的兼容性程序包進行引用,什麼會阻止此COM在其他操作系統上運行?另外,我仍然在這裏學習曲線。 =) –

回答

1

根據GitHub上報告的這個問題:Accessing mscorelib in DNX Core 5.0 #989,似乎核心CLR不能很好地支持引用mscorlib.dll的COM類型。

此外,還有一個可用於解決此問題的軟件包: Microsoft.NETCore.Portable.Compatibility

簡而言之,它所做的只是將引用mscorlib.dll的類型(如COM對象)重新映射到新版本的System.Runtime和其他庫,這些庫又轉而將其相應的DLL用於正確版本或所以。

所以解決的辦法就是在project.json添加這個包如下:

project.json

"frameworks": { 
    "dnx451": { }, 
    "dnxcore50": { 
    "dependencies": { 
     "Microsoft.CSharp": "4.0.1-beta-23516", 
     "Microsoft.NETCore.Portable.Compatibility": "1.0.1-beta-23516", 
     "System.Collections": "4.0.11-beta-23516", 
     "System.Linq": "4.0.1-beta-23516", 
     "System.Runtime": "4.0.21-beta-23516", 
     "System.Threading" : "4.0.11-beta-23516" 
    } 
    } 
} 

有關這個包更加詳細,並更多地瞭解這個問題,我強烈建議遵循提供的鏈接,因爲它們包含更深入的信息。

最後,它解決了問題! =)

相關問題