2010-05-21 58 views
0

爲什麼我的GetRawData聲明的函數在從我的VB.NET應用程序調用時返回正確的值,但從ASP.NET頁面調用時返回零?聲明的DLL函數的行爲不一致

除了類型差異(Form/Page)和調用事件處理函數(Form1_Load,Page_Load)之外,代碼完全相同。

注意:在實際代碼中,#DLL#和#RAWDATAFILE#都是我的DLL和原始數據文件的絕對文件名。

注意:該DLL文件不是由Visual Studio創建的。

Form1.vb的

Public Class Form1 

    Declare Auto Function GetRawData Lib "#DLL#" (ByVal filename() As Byte, _ 
                ByVal byteArray() As Byte, _ 
                ByVal length As Int32) As Int32 


    Private Sub Form1_Load(ByVal sender As System.Object, _ 
          ByVal e As System.EventArgs) Handles MyBase.Load 

     Dim buffer(10485760) As Byte 
     Dim msg As String, length As Integer = 10485760 
     Dim filename As String = "#RAWDATAFILE#" 
     length = GetRawData(Encoding.Default.GetBytes(filename), buffer, length) 

Default.aspx.vb

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Declare Auto Function GetRawData Lib "#DLL#" (ByVal filename() As Byte, _ 
                ByVal byteArray() As Byte, _ 
                ByVal length As Int32) As Int32 


    Protected Sub Page_Load(ByVal sender As Object, _ 
          ByVal e As System.EventArgs) Handles Me.Load 

     Dim buffer(10485760) As Byte 
     Dim msg As String, length As Integer = 10485760 
     Dim filename As String = "#RAWDATAFILE#" 
     length = GetRawData(Encoding.Default.GetBytes(filename), buffer, length) 
+1

只是一個預感,但如果你打印出Encoding.Default.WebName - 它們在兩種環境下都是一樣的嗎? – 2010-05-21 17:19:04

+0

是的,它們是一樣的。 – Steven 2010-05-21 17:31:04

回答

1

嘗試把你的dll和文件放在你的ASP.Net bin目錄中並從那裏引用它。由於安全問題,DLL可能會默默失敗。

+0

我把DLL放在我的bin文件夾中,但仍然失敗。但是,我在我的項目屬性(Web選項卡)中檢查了「NTLM身份驗證」,並且它工作正常。 – Steven 2010-05-21 18:43:10

1

稍微小於隨機猜測:ASP.NET進程無權打開由"#RAWDATAFILE#"指定的文件

1

此DLL函數似乎需要一個文件nam e並將文件中的一些數據返回到緩衝區。您不指定文件的完整路徑,「#rawdatafile#」將是相對路徑。這在asp.net頁面中工作的機率非常小。改爲指定完整路徑(如「c:\ blah \ something.txt」而不是「something.txt」)。

許多其他可能的故障模式。就像DLL路徑以及asp.net帳戶是否具有訪問這些文件的必要權限一樣。