Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OSX应用程序包中断MONO应用程序中的路径_C#_.net_Macos_Mono_Bundle - Fatal编程技术网

C# OSX应用程序包中断MONO应用程序中的路径

C# OSX应用程序包中断MONO应用程序中的路径,c#,.net,macos,mono,bundle,C#,.net,Macos,Mono,Bundle,我偶然发现了一个非常奇怪的问题,我在谷歌上找不到任何相关信息。我制作了一个小的Windows窗体应用程序,它在Windows和OSX上运行得很好,但是每当应用程序必须使用某种路径(查找app.config或获取可执行文件的路径)时,它都会返回一个断开的路径,并且只有当.exe嵌入到应用程序包中时才会发生这种情况(扩展名为.app的文件夹,由Contents/MacOS和Contents/Resources子文件夹组成)。当用户双击.app时运行的实际可执行文件只是一个脚本,几乎是“monoapp

我偶然发现了一个非常奇怪的问题,我在谷歌上找不到任何相关信息。我制作了一个小的Windows窗体应用程序,它在Windows和OSX上运行得很好,但是每当应用程序必须使用某种路径(查找app.config或获取可执行文件的路径)时,它都会返回一个断开的路径,并且只有当.exe嵌入到应用程序包中时才会发生这种情况(扩展名为.app的文件夹,由Contents/MacOS和Contents/Resources子文件夹组成)。当用户双击.app时运行的实际可执行文件只是一个脚本,几乎是“monoapp.exe”

以下是我的意思示例。Assembly.GetExecutionGassembly()。不同系统上的位置:

Windows:C:\Apps\Example.exe

使用“mono example.exe”手动通过终端运行OSX时:/Test/Folder/Structure/App.exe

从.app运行.exe时的OSX:/Test/Folder/Structure\app.exe

因此,我甚至无法让内置的.NET/Mono函数正常工作,例如ConfigurationManager.AppSettings[“IconPath”]在.app之外返回正确的数据,但从其中返回的数据是空的(可能找不到文件)

有人知道发生了什么吗?为什么会发生这种情况?我如何修复它?以下是用户双击时运行的脚本。应用程序:

#!/bin/sh

#get the bundle's MacOS directory full path
DIR=$(cd "$(dirname "$0")"; pwd)

#change these values to match your app
EXE_PATH="$DIR\MonoTests.exe"
PROCESS_NAME=MonoTestsProcess
APPNAME="Mono GUI Tests"

#set up environment
MONO_FRAMEWORK_PATH=/Library/Frameworks/Mono.framework/Versions/Current
export DYLD_FALLBACK_LIBRARY_PATH="$DIR:$MONO_FRAMEWORK_PATH/lib:/lib:/usr/lib"
export PATH="$MONO_FRAMEWORK_PATH/bin:$PATH"

#mono version check
REQUIRED_MAJOR=2
REQUIRED_MINOR=4

VERSION_TITLE="Cannot launch $APPNAME"
VERSION_MSG="$APPNAME requires the Mono Framework version $REQUIRED_MAJOR.$REQUIRED_MINOR or later."
DOWNLOAD_URL="http://www.go-mono.com/mono-downloads/download.html"

MONO_VERSION="$(mono --version | grep 'Mono JIT compiler version ' |  cut -f5 -d\ )"
MONO_VERSION_MAJOR="$(echo $MONO_VERSION | cut -f1 -d.)"
MONO_VERSION_MINOR="$(echo $MONO_VERSION | cut -f2 -d.)"
if [ -z "$MONO_VERSION" ] \
    || [ $MONO_VERSION_MAJOR -lt $REQUIRED_MAJOR ] \
    || [ $MONO_VERSION_MAJOR -eq $REQUIRED_MAJOR -a $MONO_VERSION_MINOR -lt $REQUIRED_MINOR ] 
then
    osascript \
    -e "set question to display dialog \"$VERSION_MSG\" with title \"$VERSION_TITLE\" buttons {\"Cancel\", \"Download...\"} default button 2" \
    -e "if button returned of question is equal to \"Download...\" then open location \"$DOWNLOAD_URL\""
    echo "$VERSION_TITLE"
    echo "$VERSION_MSG"
    exit 1
fi

#get an exec command that will work on the current OS version
OSX_VERSION=$(uname -r | cut -f1 -d.)
if [ $OSX_VERSION -lt 9 ]; then  # If OSX version is 10.4
    MONO_EXEC="exec mono"
else
    MONO_EXEC="exec -a \"$PROCESS_NAME\" mono"
fi

#create log file directory if it doesn't exist
LOG_FILE="$HOME/Library/Logs/$APPNAME/$APPNAME.log"
mkdir -p "`dirname \"$LOG_FILE\"`"

#run app using mono

$MONO_EXEC $MONO_OPTIONS "$EXE_PATH" $* 2>&1 1> "$LOG_FILE"
我认为OSX版本是特立独行的