【问题标题】:How can SQLAnywhere's "external CLR" access a System ProcessSQLAnywhere 的“外部 CLR”如何访问系统进程
【发布时间】:2023-12-22 06:59:01
【问题描述】:

需要 SQLAnywhere (16) 中的扩展来访问运行数据库的服务器上的一些 DOS 功能,我尝试了:

要从 Sybase 调用的 DLL 的第一个代码

________! SAExternal.vb !____________

Imports System.Diagnostics  

Public Class SAExternal  
    Public Shared Function getDone()
        Dim myProcess As Process = System.Diagnostics.Process.Start("notePad.exe", "C:\data\CLR\zTest.txt")  

        myProcess.WaitForExit()  
        myProcess.Close()  

        getDone = "OK"  
    End Function  
End Class

编译使用 :
vbc.exe /t:library /out:SAExt.dll SAExternal.vb

按照一些代码来测试我的 DLL

_________! SAMain.vb !______________

Module SAMain  

    Sub Main()  
        Dim obj as New SAExternal()  

        MsgBox("Test SAMain " & obj.getDone())  
    End Sub  

End Module  

编译使用:vbc.exe /t:winexe /r:SAExt.dll SAMain.vb

SAMain.exe 正确打开 notepad.exe,等到我关闭它,并带有消息“Test SAMain OK”

在 SQLAnywhere 中,我编写了代码:

CREATE FUNCTION getDone() 
RETURNS LONG VARCHAR
EXTERNAL NAME 'C:\data\CLR\SAExternal\SAExt.dll::SAExternal.getDone() string' 
LANGUAGE CLR

通过“Select getDone()”调用函数返回错误: “无法加载文件或程序集 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=........' 或其依赖项之一......”

如果我取出 SAExternal 模块的 Process 部分:

Public Class SAExternal
    Public Shared Function getDone()
        getDone = "OK"
    End Function
End Class

我的函数给了我正确的答案(“OK”)

出于测试目的,我将所有这些文件与我的数据库文件放在同一目录中,包括 .vb 和 .dll 。

我已经在网上搜索了几天以了解我做错了什么,但找不到我错过了什么。

有人可以帮我吗?

【问题讨论】:

    标签: vb.net dll clr sqlanywhere external-process


    【解决方案1】:

    试试

    CREATE FUNCTION getDone() RETURNS LONG VARCHAR
    EXTERNAL NAME 'C:\data\CLR\SAExternal\SAExt.dll::SAExternal.getDone() *out* string' 
    LANGUAGE CLR
    

    请注意在字符串之前添加了 out 选项

    【讨论】:

    • getDone() 函数的执行在out 字符串的out(或out)附近返回语法错误。你确定这个语法在 SQLAny 16 中是正确的吗?它说:“参数列表中的类型不正确:out 字符串无法识别”
    最近更新 更多