2016-10-31 43 views
2

我正在尋找將用VB6編寫的一些遺留COM代碼遷移到.NET的方法,但是這需要生成一個與原始代碼非常接近的類型庫。C# - 生成typelib - 指定庫名稱?

總的來說,一切正常。然而,由regasm生成的typelib提供了一個我無法控制的庫名。

生成的IDL(從regasm backcompat.dll /tlb:backcompat.tlb)的頂部看起來像:

// Generated .IDL file (by the OLE/COM Object Viewer) 
// 
// typelib filename: BackCompat.tlb 

[ 
    uuid(BF1F4E76-8F4A-420E-A58A-E041600AC02A), 
    version(1.0), 
    helpstring(".NET replacement for legacy VB objects") 
] 
library BackCompat 
{ 
    // TLib :  // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D} 
    importlib("mscorlib.tlb"); 
    // TLib : Microsoft ActiveX Data Objects 6.1 Library : {B691E011-1797-432E-907A-4D8C69339129} 
    importlib("msado15.dll"); 
    // TLib : : {4FB2D46F-EFC8-4643-BCD0-6E5BFA6A174C} 
    importlib("System.EnterpriseServices.tlb"); 
    . 
    . 
    . 

我想匹配的特定聲明,對library上線10,其出山爲BackCompat(名解決方案和DLL)。

C#代碼的命名空間爲UtilityLib,VB6中的原始類爲UtilityLib.Database,UtilityLib,Guid等;我可以強制使用ProgId屬性的編號,但庫名稱本身似乎難以捉摸。

不幸的是,因爲庫被聲明爲BackCompat,所以當試圖鏈接到使用早期綁定的現有VB6庫時,構建失敗,因爲他們正在尋找UtilityLib.{whatever}:所以我必須更改源代碼參考BackCompat.{whatever};即,VB6的代碼看起來像這樣:

Dim dbConn As UtilityLib.Database 

已更改爲:

Dim dbConn as BackCompat.Database 

雖然改變所有VB6一重擊將是了不起的,這是不是一種選擇:傳統的VB6組件將隨着時間的推移而被換出,換成.NET版本。

重命名文件似乎沒有解決這個問題,所以它必須從程序集本身獲取名稱。有沒有我可以在AssemblyInfo.cs中指定的屬性來控制這個屬性,還是僅僅是修復解決方案本身的情況?

+0

我對此不甚瞭解 - 名稱是否可以從以前的版本中讀取,並以這種方式永久保存?我似乎回想起VB6在做我以前的事情。 – Rob

+1

庫名稱與程序集名稱相同。項目>屬性>生成選項卡>「程序集名稱」設置。很難想到這個錯誤,考慮你的VB6項目可能引用了舊版本的類型庫。 –

+0

@Hans:哈 - 那就是它,ta。我認爲我的代碼是盲目的:因爲我可以通過方法名稱,方法屬性,程序集屬性等來控制其他所有內容,所以我在不考慮項目設置的情況下尋找相同的東西。乾杯。放下您的評論作爲答案,我會upvote和勾選,ta。 –

回答

1

正如評論的問題提到漢斯:

庫名稱是一樣的程序集名稱。項目> 屬性>生成選項卡>「程序集名稱」設置。很難得到 這個錯誤,認爲你的VB6項目可能引用了舊的 版本的類型庫。

我沒有考慮過的東西(看着其他東西,沒有考慮項目設置)。