OSX App Bundle打破了MONO应用程序中的路径

时间:2015-03-23 15:49:38

标签: c# .net macos mono bundle

我偶然发现了一个非常奇怪的问题,我无法在google中找到任何关于它的信息。我已经制作了一个小型Windows窗体应用程序,可以在Windows和OSX上正常运行,但只要应用程序必须使用某种路径(找到app.config或获取可执行文件的路径),它就会返回一个断开的路径,这只发生在.exe嵌入在App捆绑包中(扩展名为.app的文件夹,其中包含Contents / MacOS和Contents / Resources子文件夹)。当用户双击.app时运行的实际可执行文件只是一个脚本,几乎就是" mono app.exe"。

这是我的意思的一个例子。 Assembly.GetExecutingAssembly()。不同系统上的位置:

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,但是从它内部,它是空的(可能无法找到该文件)。

有没有人知道发生了什么?为什么会发生这种情况,我该如何解决?这是用户双击.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版本是Maverick。

0 个答案:

没有答案