我需要遷移32位DLL才能在64位C#(以及C++)應用程序中使用它。該DLL是在非託管的delphi代碼中寫入的。我不能重新編譯dll,唯一的辦法就是使用進程間通信(IPC)。我搜索了很長時間,但是我沒有找到有關的信息。我發現的最好的指南是在這個鏈接:Accessing 32-bit DLLs from 64-bit code。從64位代碼訪問32位DLL
我遵循這個指南來達到我的目標,因爲這個論壇經常被引用。所以本指南解釋我必須做三個步驟:
1°STEP - 創建一個32位組件,實現一個COM對象,該對象加載並調用到32位DLL中,並將32位DLL接口公開爲COM接口。所以我做了同樣的事情,解釋here(從以前的鏈接採取爲例):
[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGetMyString
{
string GetMyString();
}
[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")]
[ProgId("CallPDW.Class1")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IGetMyString
{
string GetMyString()
{
......
}
}
那我也註冊.NET COM組件,所以我必須使用Regasm.exe,而是我創建Visual Studio安裝程序和部署項目,這些項目構建了一個MSI文件並使Regasm可以做到同樣的事情。然後我控制註冊表編輯器,我找到了HKEYs,所以它的工作原理。 因此,直到這一步一切正常或似乎沒問題。
2°STEP - 通過創建一個標準COM + OOP應用程序(使用的dllhost作爲代理進程)配置外的過程(OOP)這種COM組件;
3°STEP - 創建一個64位包裝器DLL,它實現與原始32位DLL相同的接口,導入上面創建的COM對象的COM接口, 將當前調用轉換爲公開的接口調用到COM對象接口,傳送呼叫參數,接收返回值並將它們委託給呼叫者;
的問題是,在2°和3°的步驟我不知道如何實現,因爲我沒有發現任何東西在網絡上或在這個論壇。所以我需要幫助來實現步驟2°和3°。也可以鏈接到其他職位等 在此先感謝。
其它信息(2016年12月10日 - 下午11點10): 1.)與函數指針一個C/C++頭(: 此DLL通過兩個接口暴露其功能,以32位的天然環境中WINAPI *) 2)與對一個.NET接口/ Invoke的
HI @Aurora。非常感謝您回答。確定它工作到「... ains [DllSurrogate]條目。」 – bob
現在我想自動執行此操作。你有一些建議嗎?另外,我還想爲COM可見包裝器類創建一個包裝器DLL,以便直接使用另一個DLL來調用我的x64主機中的函數。 – bob
您是否以完全管理權限(以管理員身份運行)運行'oleview'?您需要各自的權限才能寫入註冊表。如果您想手動編寫'DllSurrogate'條目,請查看[this](https://msdn.microsoft.com/en-us/library/windows/desktop/ms691260(v = vs.85).aspx )鏈接。關於你的第二個DLL:你可以通過你的COM可見封裝來公開'P/Invoke'函數。只需在接口和類中添加一個新的方法,即調用相應的函數。 – Aurora