我正在尋找將用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
中指定的屬性來控制這個屬性,還是僅僅是修復解決方案本身的情況?
我對此不甚瞭解 - 名稱是否可以從以前的版本中讀取,並以這種方式永久保存?我似乎回想起VB6在做我以前的事情。 – Rob
庫名稱與程序集名稱相同。項目>屬性>生成選項卡>「程序集名稱」設置。很難想到這個錯誤,考慮你的VB6項目可能引用了舊版本的類型庫。 –
@Hans:哈 - 那就是它,ta。我認爲我的代碼是盲目的:因爲我可以通過方法名稱,方法屬性,程序集屬性等來控制其他所有內容,所以我在不考慮項目設置的情況下尋找相同的東西。乾杯。放下您的評論作爲答案,我會upvote和勾選,ta。 –