2014-04-04 56 views
2

我有一些代碼依賴於對COM應用程序的供應商產品的一部分的引用,使用.NET自動COM包裝(我剛剛添加了一個使用Visual Studio的添加引用對話框的引用,並從註冊COM組件列表)。我的代碼面向.NET Framework 4.0。針對兩個不同的程序集引用編譯相同的代碼?

供應商產品的最新版本已棄用COM GUI應用程序,但現在隨附COM COM interop DLL,它實現與原始COM應用程序相同的API。但是,新的COM interop DLL是使用.NET Framework 4.5編譯的。

由於API是相同的,我不想維護兩個單獨的代碼庫以便與供應商產品的較舊和較新版本兼容。

如何設置我的Visual Studio項目,以便我可以擁有一個代碼庫,它可以與原始的VendorApplication COM組件(最好在.NET 4.0上(如果可行))和新的VendorApplication.Interop.dll(在.NET 4.5)?

+0

因此,您的目標是.NET 4.0,但是如果您的應用程序已安裝在使用.NET 4.5的系統上,那麼您希望使用新的供應商庫? – Noseratio

+0

我正在編寫與供應商產品交互的工具。我希望我的工具能夠使用舊版本的產品(自動COM包裝器參考)和較新版本(供應商提供的COM interop DLL),最好不需要維護兩個代碼庫。如果我必須升級到使用.NET 4.5同時支持這兩個版本,那我可以,但如果我可以同時定位到4.0上的舊COM包裝和4.5上新的Interop.DLL,那更好。 – Hydrargyrum

回答

1

我如何建立我的Visual Studio項目,這樣我可以有一個代碼 基地與兩個原始VendorApplication COM 組件(最好是在.NET 4.0,如果這是可行的)和新 VendorApplication工作。 Interop.dll(在.NET 4.5上)?

這樣做的一種方式是創建相同「thunk」庫的兩個版本,從而暴露相同的API。每個版本都應該有自己的strong name

  • 第一個版本(比如,MyInterfaceAssembly.dll版本爲v4.0.0.1)應針對.NET 4.0和使用舊的供應商庫。

  • 第二個版本(MyInterfaceAssembly.dll v4.5.0.1)應該針對.NET 4.5並使用新的供應商庫。

  • 您的應用程序構建爲引用並鏈接到第一個版本(v4.0.x)。

  • 安裝程序將安裝v4.0.x或v4.5.x,具體取決於最終用戶系統。

  • 最重要的部分是app.config文件,在那裏你會使用<bindingRedirect>

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="MyCompany.MyInterfaceAssembly" publicKeyToken="xxxxxxxxxxxxxxxx" culture="neutral" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.0.0.1" newVersion="4.5.0.1" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

在.NET 4.5你的應用程序將運行使用MyInterfaceAssembly.dll v4.5.x,提供V4.0 .x已安裝而不是

相關問題