2011-11-03 28 views
8

Tôi có một dịch vụ WCF có chứa một số mã C#, trong đó tham khảo một dll C++/CLI, tham khảo một số DLL gốc. Tôi bao gồm tất cả các file DLL cần thiết trong thư mục bin cho các ứng dụng IIS của tôi, nhưng khi IIS tải DLL quản lý, có vẻ như được sao chép chúng vào một thư mục sâu như:Làm cách nào để tải IIS bản địa được dịch vụ WCF của tôi tham chiếu?

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\testwcf\73473be6\e625098c\assembly\dl3\aada7c33\85a7332b_2f9acc01 

Nó sao chép mỗi DLL cố gắng của mình thư mục riêng và tải nó. Khi nó được gửi đến C++/CLI DLL của tôi, nó sao chép nó vào một thư mục như trên, và sau đó nó không thể tải các phụ thuộc. Nếu tôi tự sao chép tất cả các DLL gốc vào thư mục này, nó sẽ chạy, nhưng đó không phải là một giải pháp tuyệt vời.

My web.config là tệp cổ phiếu được tạo bởi VS, với điểm cuối được xác định dựa trên bài viết MSDN.

<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service name="WcfService.Service1"> 
     <endpoint address="" 
        binding="wsHttpBinding" 
        contract="WcfService.IService1" /> 
     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

Làm cách nào để nhận các tệp DLL này tự động?

+0

nội dung của web.config của bạn sẽ giúp hiểu nó tốt hơn –

+0

@SSamra Bài đăng hiện được cập nhật –

+0

không thể thấy bất kỳ điều gì sai, làm thế nào về AppPool của bạn là nó 32 bit được kích hoạt? bạn có thể tìm thấy nhóm ứng dụng của mình trong IIS \ Application Pools và sau đó chọn một ứng dụng mà bạn đang chạy ứng dụng web của mình –

Trả lời

9

Từ this post, có vẻ như các file DLL có nguồn gốc cần phải có sẵn trong thư mục nhất định hoặc vào đường dẫn:

Nguyên nhân cốt lõi cho vấn đề này là trong cách hệ điều hành tải bản địa DLL khi chạy . DLL gốc được tải bằng cách sử dụng logic sau không bao gồm Tệp ASP.net tạm thời hoặc thư mục ứng dụng/thùng thư. Vấn đề này cũng sẽ xảy ra trong bất kỳ ứng dụng .Net nếu DLL gốc không được bao gồm trong thư mục/bin với tệp .EXE hoặc nếu DLL không nằm trong Biến môi trường đường dẫn.

  1. Thư mục mà ứng dụng đã tải. Trong trường hợp của ASP.Net, điều này sẽ giải quyết thành% windir% \ Microsoft.Net \ Framework \ v ### \ hoặc% windir% \ system32 \ inetsrv cho IIS 6.
  2. Thư mục hiện tại. Trong trường hợp của ASP.Net, điều này sẽ giải quyết cho% windir% \ System32 \ inetsrv cho IIS 6. Nếu sử dụng máy chủ web tích hợp, điều này giải quyết một đường dẫn trong C: \ Program Files \ Microsoft Visual Studio 8 .
  3. Hệ thống Windows thư mục. Sử dụng hàm GetSystemDirectory để lấy đường dẫn của thư mục này.
  4. Thư mục Windows. Sử dụng hàm GetWindowsDirectory để nhận đường dẫn của thư mục này.
  5. Các thư mục được liệt kê trong biến môi trường PATH.

Các giải pháp được cung cấp như sau:

  1. Sử dụng DllImport để tải dll sử dụng một đường dẫn tương đối hoặc tuyệt đối tại runtime.
  2. Đặt Biến môi trường PATH để quy trình ASP.Net có thể định vị tệp DLL C++. Bạn có thể đặt thuộc tính này trong thời gian chạy để nó chỉ ảnh hưởng đến quá trình chạy mã của bạn. Bạn cũng có thể đặt số này trên toàn cầu trong thuộc tính Hệ thống (Biến môi trường | PATH ).Thiết lập chương trình này không yêu cầu khởi động lại và bạn có thể trỏ PATH vào thư mục/bin của ứng dụng web nếu bạn muốn để có thể thực hiện triển khai XCopy ứng dụng ASP.Net của mình. Ở đây là các bước để đặt Đường dẫn theo lập trình từ ASP.Net.

Ngoài ra còn có một số giải pháp phức tạp liên quan đến # 2 liên quan đến cập nhật chương trình PATH.

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