運行 PIDL 編譯器

1. Windows

您可以使用 PIDL附加元件方便地建立和編譯 PIDL 文件,但如果您無法使用它,請使用下列方法設定 PIDL Custom Build

1-1. 在 Visual Studio 專案中設定 PIDL Custom Build

每個建置設定的詳細資訊如下。

命令列: <PIDL.exe所在路徑>\PIDL.exe "%(FullPath)" -outdir .

註釋: Compiling %(Filename).pidl ...

輸出: %(RootDir)%(Directory)%(Filename)_common.cpp;%(RootDir)%(Directory)%(Filename)_common.h;%(RootDir)%(Directory)%(Filename)_proxy.cpp;%(RootDir)%(Directory)%(Filename)_proxy.h;%(RootDir)%(Directory)%(Filename)_stub.cpp;%(RootDir)%(Directory)%(Filename)_stub.h;%(Outputs)

附加從屬性: <PIDL.exe所在路徑>\PIDL.exe

  • PIDL.exe位於ProudNet安裝路徑的util資料夾中。

  • Debug和Release必須設定相同。

所有設定完成後,您可以編譯 PIDL 檔案並查看如下所示的輸出。

1>---— 開始建構: 專案: ..., 構成: Release Win32 ---—
1>Compiling TestC2C.pidl ...
1>建置日誌保存到“...”。
1>ProudNetTest_2005 - 錯誤:0,警告:0
========== 建置:1 成功,0 失敗,0 最新,0 跳過 ==========

Visual Studio 2005 和 2008 版本支援Custom Build Rules,因此它們會自動設置,而無需在每次新增 PIDL 檔案時設定自訂生成。 Visaul Studio 2010 及更高版本可使用Build customizations


2. Linux

在Ubuntu上安裝開源Mono庫的範例 ※ 開源 Mono 專案支援 Linux、Windows 和 Mac OS。

$sudo apt-get install mono-gmcs
$sudo apt-get install mono-runtime


3. C#

RMI 也可以在 C# 語言中使用,為此,PIDL 編譯器也為 C# 語言產生代理程式和存根程式碼。

執行以下命令將產生 C# 語言的代理程式和存根程式碼。 (現有的 -clr 與 -cs 相同。)

PIDL.exe -cs <input-file-name>

常用模組推薦使用C#語言建立的proxy和stub。 與 PIDL 一樣,此模組需要從 C# 專案和自訂建置輸入 PIDL 檔案。

建構C2S.pidl後所建立的代理和存根如下。

  • C2S_common.cs

  • C2S_proxy.cs

  • C2S_stub.cs

將這些檔案包含在您的 C# 專案 (.csproj) 中。 但是,這些檔案是建置結果,不應放置在原始程式碼管理(例如 SVN 等)中,因為唯讀檔案中可能會出現寫入錯誤。

我們建議使用編輯器開啟 .csproj 檔案並進行以下修改:

<Target Name="BeforeBuild">
<ItemGroup>
<Compile Include="C2S_common.cs" />
<Compile Include="C2S_proxy.cs" />
<Compile Include="C2S_stub.cs" />
</ItemGroup>
 
</Target>
<Target Name="AfterBuild">
</Target>

C#語言中建立的Proxy和Stub是C++中的同名類,它們的用法也是一樣的。

- RMI proxy, stub類別public, internal, private設定

PIDL編譯器產生的代理類別、存根類別和公用類別的存取修飾符預設為internal。 這些類別可以從同一模組(或組件)內的不同來源使用,但不能從其他模組使用。

但是,當您建立一個單獨的模組來收集這些類別並希望在其他模組中使用此模組中的類別時,您可能需要將存取修飾符變更為 public。

在這種情況下,設定 PIDL 編譯器產生的類別的存取修飾符屬性,如下所示。

// This will let proxy, stub and common classes to have access modifier 'public'.
[marshaler(clr)=MyMarshaler, access=public]
global MyC2S 3000
{
    Foo(...);
}

Last updated