2010-11-01 25 views
5

Tôi nhận ra rằng nó đã được hỏi và trả lời rằng Visual Studio không hỗ trợ các dự án CIL/MSIL. Dự án MSBuildContrib có tác vụ ILASM cho phép bạn biên dịch các tệp IL tại thời gian xây dựng.Có bất kỳ ví dụ nào về việc biên dịch mã CIL từ bên trong một dự án Visual Studio

Googled xuất hiện trên các ví dụ về cách sử dụng tác vụ này.

Có bất kỳ ví dụ nào về việc sử dụng ILASM như một phần của giải pháp Visual Studio không? Tôi nhận ra rằng #develope và hỗ trợ ILIDE CIL ... mục tiêu ở đây là biên dịch một số tệp CIL như một phần của giải pháp Visual Studio.

+0

Tôi có thể hỏi tại sao bạn thực sự cần phải biên dịch với IL? C#/VB.NET/F # không thể làm gì? – leppie

+2

@Leppie - Đó là một chủ đề phù hợp cho cuộc tranh luận dài, đủ để nói rằng có (được thừa nhận là ít) những điều dễ dàng hơn để đạt được với IL hơn với C# hoặc VB - đặc biệt khi tạo Generics làm việc với các đại biểu. IL, naughtily, cho phép bạn tự động pcik và chọn các đối số để đẩy vào ngăn xếp trước khi gọi một phương pháp. C# và VB thì không.Thông thường một điều tốt, nhưng đôi khi uốn các quy tắc mở ra cánh cửa mới. Các đại biểu năng động là một ví dụ về điều này. – Mark

+0

@Mark, bạn có thể nói ngắn gọn (hoặc cung cấp liên kết đến) những gì bạn có thể cải thiện cho các đại biểu bằng MSIL? Điều này có thể giúp bạn viết các phương thức hoạt động cho tất cả các loại đại biểu không? –

Trả lời

1

Bạn có thể thêm "dự án makefile". Mẫu nằm trong Visual C++, General. Kiểu dự án này cho phép bạn chỉ định các lệnh xây dựng tùy chỉnh cho các hành động Xây dựng, Làm sạch và Xây dựng lại. Môi trường sẽ được thiết lập tự động, do đó bạn không phải gây rối với đường dẫn. C++ IDE cũng hỗ trợ tạo quy tắc xây dựng tùy chỉnh để bạn có thể tự động kích hoạt công cụ thích hợp (ilasm.exe) từ phần mở rộng tên tệp (.il).

Tuy nhiên, điều đó là tốt. Không có ánh xạ tự động của nhiều tệp .il trong dự án với một lệnh xây dựng đơn lẻ. Viết một makefile nmake.exe là cần thiết để có được điều đó. Và hãy cẩn thận rằng hỗ trợ các quy tắc xây dựng tùy chỉnh đã bị hỏng trong vs2010.

+0

Cảm ơn bạn Hans! Đó là nhiều hơn hoặc ít hơn những gì tôi cần. BTW - bất kỳ ý tưởng tại sao các mẫu MSBUILD trên Codeplex đã bị ngưng? Tôi đã thử chúng trong VS2010 và không có niềm vui ... dường như là một đóng góp hữu ích. – Mark

+0

là có bất kỳ nguy hiểm trong việc canibalizing một csproj, loại bỏ các "csharp.targets" và sau đó thêm các nhiệm vụ xây dựng tùy chỉnh để comile IL? Điều này sẽ làm việc tốt hơn hoặc tệ hơn về kiểm soát nguồn? – Mark

+0

Không có gì tôi đăng trong câu trả lời này là bất kỳ cách nào liên quan đến MSBuild. Bạn cung cấp cho các lệnh xây dựng giống như bạn chỉ định chúng trong một sự kiện xây dựng trước/sau. –

12

Tôi đã trả tiền Hans để trả lời câu hỏi này, nhưng sau khi một số thử nghiệm tôi đã có một giải pháp mà đến hơi gần nhà:

thế nào để lập CIL/MSIL TRONG VISUAL STUDIO

Các sau hack được bạn một dự án mà:

  • Tôn trọng cấu hình gỡ lỗi và phát hành bản phát hành trong Visual Studio.
  • Tùy chọn ký hợp đồng CIL kết quả với tệp khóa được thiết lập trong tùy chọn dự án.
  • Có thể được thêm vào điều khiển nguồn.

Thực hiện theo các bước sau:

  1. Tạo một trống rỗng C# classs thư viện
  2. Trong thư mục giải pháp, nhấn chuột phải dự án và chọn "dự án dỡ bỏ"
  3. Nhấp chuột phải vào dự án dỡ và chọn "chỉnh sửa dự án"
  4. Trong tệp csprof, cuộn xuống dưới cùng và tìm dòng có nội dung "Nhập ... Project =" $ (MSBuildBinPath) \ Microsoft.CSharp.targets "và thay thế bằng mã tại http://pastebin.com/KEJtyQLu (sao chép dưới đây)

Đây là XML:

<Import Project="$(MSBuildToolsPath)\Microsoft.Common.targets" /> 

    <Target Name="CreateManifestResourceNames" /> 

    <Target Name="CoreCompile" Inputs="$(MSBuildAllProjects);@(Compile);" Outputs="@(IntermediateAssembly);$(NonExistentFile);"> 
    <GetFrameworkPath> 
     <Output TaskParameter="Path" PropertyName="FrameworkPath" /> 
    </GetFrameworkPath> 

    <PropertyGroup> 
     <IlAsmCommand>&quot;$(FrameworkPath)\Ilasm.exe&quot; /NOLOGO /DLL /OUTPUT:&quot;@(IntermediateAssembly)&quot; </IlAsmCommand> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' " > 
     <IlAsmCommand>$(IlAsmCommand) /DEBUG </IlAsmCommand> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(Configuration)' == 'Release' " ><IlAsmCommand>$(IlAsmCommand) /OPTIMIZE </IlAsmCommand></PropertyGroup> 

    <PropertyGroup Condition=" '$(AssemblyOriginatorKeyFile)' != '' " > 
     <IlAsmCommand>$(IlAsmCommand) /KEY:&quot;$(AssemblyOriginatorKeyFile)&quot; </IlAsmCommand> 
    </PropertyGroup> 

    <Exec Command="$(IlAsmCommand) @(Compile->'&quot;%(FullPath)&quot;', ' ')" 
      Outputs="@(IntermediateAssembly)" /> 

    <CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''" /> 

    </Target> 
+0

Cảm ơn, điều đó đã cho tôi một điểm khởi đầu hữu ích. Tôi đã sử dụng MonoDevelop mà bình thường có thể biên dịch các dự án CIL tốt, nhưng cho dù lỗ hổng là với nó hay với tôi tôi không thể ký hợp đồng để làm việc một cách chính xác, và căn cứ thay đổi tập tin ilproj trên đã sắp xếp nó. Đối với một bản dựng đơn, hãy thay thế '" $ (FrameworkPath) \ Ilasm.exe " 'bằng' ildasm' (phân biệt chữ hoa chữ thường) và loại bỏ phần bổ sung gỡ lỗi và phát hành (cả hai tính năng nhấn mono ildasm chưa hỗ trợ. MS cũng có thể là tốt để thêm vào '/ RESOURCE: someResourceFile.res' (Tôi vừa được mã hóa cứng vào' IlAsmCommand' đầu tiên) –

Các vấn đề liên quan